Python Django:按目录指定基础模板

Python Django:按目录指定基础模板,python,django,django-templates,Python,Django,Django Templates,我在Django网站上工作,该网站有多个部分和子部分。我希望有几个深度的模板继承:一个用于整个站点的基础模板,一个用于从根基础模板继承的每个部分的基础模板,等等。以下是我所需目录结构的简化版本: base.html section1/ base.html section2/ base.html section3/ base.html 我希望section1/下的所有文件都包含类似{%extends“base.html”%},这意味着它们将扩展section1/base.htmlse

我在Django网站上工作,该网站有多个部分和子部分。我希望有几个深度的模板继承:一个用于整个站点的基础模板,一个用于从根基础模板继承的每个部分的基础模板,等等。以下是我所需目录结构的简化版本:

base.html
section1/
  base.html
section2/
  base.html
section3/
  base.html
我希望
section1/
下的所有文件都包含类似
{%extends“base.html”%}
,这意味着它们将扩展
section1/base.html
section1/base.html
将包含类似于
{%extends./base.html“%}
的内容,这意味着它将扩展根级别的基本文件。然而,我在文档中找不到任何东西表明这是可能的,我也无法让Django区分
“./base.html”
“base.html”
。(
{%extends../base.html“%}
抛出错误。)我想一个解决办法是重命名所有的基本文件
base_SECTIONNAME.html
,并更新从它们继承的所有文件,但我担心,随着我的网站变得越来越大,部分更改名称,这可能会变得难以维护,我更喜欢利用目录和子目录指定的自然层次结构的解决方案


有什么想法吗?

可能是我在监督一些事情,但是你想要的一切都可以通过django模板系统来完成。所有扩展调用都是相对于模板目录的

  • 为了使子目录中的所有base.html文件扩展base.html,您只需将
    {%extends“base.html”%}
    放入文件中即可。第1节/base.html将是这样的

    {%extends“base.html”%}

    {#…代码的其余部分…#}

  • 现在,要从section1获取扩展section1/base.html的文件,只需将
    {%extends“section1/base.html”%}
    放在它们的顶部即可。第2节、第3节等也是如此

  • 它就这么简单,但在文档中可能并不完全明显


    我希望,我理解了你的问题。

    接受的答案会有效,但我建议使用变量名来跟踪节结构。我个人的偏好是一个。例如,如果您的站点的分区组织透明地反映在url中,请尝试以下操作:

    # It may be convenient to make this function live in or near your url conf.
    def convert_url_path_to_folder_path(path):
        # fill in the magic here
    
    def sub_folder_available(request):
        folder = convert_url_path_to_folder_path(request.path)
        return {'subsection': folder, 'local_base':folder+'/base.html'}
    
    然后在模板中,只需调用

    {% extends local_base %}
    
    可能还有十几种其他方法可以做到这一点,但主要是要考虑避免将文件夹名称硬编码到模板中。这将为您带来很多好处,特别是因为您可以在节之间拖放模板,如果它们恰好足够相似的话。您可以添加的另一项插入内容是:

    def sub_folder_available(request):
        folder = convert_url_path_to_folder_path(request.path)
        # Check if local base exists:
        if os.access(folder+'/base.html',os.F_OK):
            base = folder+'/base.html'
        else:
            # revert to your global base
            base = 'base.html'
        return {'subsection': folder, 'base':base}
    

    此策略的优点当然是,您可以在根本不使用任何本地基础模板的情况下启动并运行fly-weight部分。

    您可以使用此库:

    只需在模板中编写以下内容:

    {%load relative_path%} {%extends“.base.html”%}

    这将扩展模板“base.html”,该模板位于模板所在的同一文件夹中

    {%load relative_path%} {%扩展“…base.html”%}

    扩展位于两个更高级别的模板“base.html”


    “include”标记也可以使用相同的功能。

    它们不能,因为您可以在不同的位置使用模板。值得一提的是,所有文件夹(/root、/root/section1、/root/section2,…)都必须设置为django TEMPLATE\u DIRS,否则将无法使用。文章不错。我不确定,如果我失去更多,那么我会从这个解决方案中获益。我必须对此进行评估。显然,这是逐案的。只是暗示组织的其他层可以发挥作用。