Django:按目录指定基本模板

2024-05-08 12:18:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

base.html
section1/
  base.html
section2/
  base.html
section3/
  base.html

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

有什么想法吗?


Tags: 文件django版本目录模板内容base站点
3条回答

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

  1. 为了让子目录中的所有base.html文件扩展base.html,只需在文件中放入{% extends "base.html" %}。section1/base.html应该是这样的。

    {% extends "base.html" %}

    {# ... rest of your code ...#}

  2. 现在,要从section1获取文件以扩展section1/base.html,只需将{% extends "section1/base.html" %}放在它们的顶部。第2节、第3节等相同。

它就是这么简单,但在文档中可能不是很明显。

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

可以接受的答案,但我确实建议使用变量名来跟踪节结构。我个人的喜好是context processor。例如,如果站点的分区组织透明地反映在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 %}

可能还有很多其他方法可以做到这一点,但最主要的是要考虑避免将文件夹名称硬编码到模板中。这将为您带来很多里程,特别是因为您可以拖放模板之间的部分,如果他们碰巧足够相似。您还可以添加insert:

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部分。

你可以使用这个库:https://github.com/vb64/django.templates.relative.path

只需按以下方式填写模板:

{%加载相对路径% {%扩展“.base.html”%}

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

{%加载相对路径% {%扩展“…base.html”%}

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

“include”标签也同样适用。

相关问题 更多 >