Python Django:按目录指定基础模板
我在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
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模板系统来完成。所有扩展调用都是相对于模板目录的
{%extends“base.html”%}
放入文件中即可。第1节/base.html将是这样的
{%extends“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,否则将无法使用。文章不错。我不确定,如果我失去更多,那么我会从这个解决方案中获益。我必须对此进行评估。显然,这是逐案的。只是暗示组织的其他层可以发挥作用。