我正在开发一个有多个部分和子部分的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,您只需将a {% extends "base.html" %}
放入文件中即可.section1/base.html会是这样的.
{% extends "base.html" %}
{# ... rest of your code ...#}
现在,要将section1中的文件扩展为section1/base.html,您只需将{% extends "section1/base.html" %}
它们置于顶部即可.第2节,第3节等相同.
它就是这么简单,但在文档中可能并不完全明显.
我希望,我理解你的问题.
接受的答案将起作用,但我建议使用变量名来跟踪截面结构.我个人的偏好是上下文处理器.例如,如果您的网站的部门组织透明地反映在网址中,请尝试以下操作:
# 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}
这种策略的优点当然是你可以在没有任何本地基本模板的情况下启动并运行飞行重量部分.