我正在开发一个有多个部分和子部分的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
,并更新从它们继承的所有文件,但我担心这可能很难维护我的网站变得更大,部分更改名称等。我更喜欢利用目录和子目录指定的自然层次结构的解决方案。
有什么想法吗?
答案 0 :(得分:18)
我可能会监督某些事情,但您可以使用django模板系统完成所有工作。所有扩展调用都与模板目录相关。
为了让子目录中的所有base.html文件扩展base.html,您只需将{% extends "base.html" %}
放入文件中即可。 section1 / base.html看起来就像那样。
{% extends "base.html" %}
{# ... rest of your code ...#}
现在,要将section1中的文件扩展为 section1 / base.html ,您只需将{% extends "section1/base.html" %}
放在它们的顶部即可。第2节,第3节等相同。
就是这么简单,但在文档中可能并不完全明显。
我希望,我理解你的问题。
答案 1 :(得分:5)
接受的答案可行,但我建议使用变量名来跟踪部分结构。我个人的偏好是context processor。例如,如果您的网站的部门组织透明地反映在网址中,请尝试以下操作:
# 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}
这种策略的优点当然是你可以在没有任何本地基本模板的情况下启动并运行飞行重量部分。
答案 2 :(得分:0)
您可以使用此库:https://github.com/vb64/django.templates.relative.path
只需在模板中写下如下:
{%load relative_path%} {%extends" .base.html" %}
这会扩展模板" base.html",位于放置模板的同一文件夹中
{%load relative_path%} {%extends" ... base.html" %}
扩展模板" base.html",位于更高的两个级别
同样适用于' include'标签