我已经熟悉 Django 2 个小时了,我想知道是否有一种方法可以指定一个默认的基本模板,该模板将自动为所有模板加载,这样您就不必重复自己并在每个模板的顶部指定
{% extends "foo.html" %}
页面模板。
例如,在项目或应用程序级别,某些元数据(设置)可以指定使用的默认模板,除非对渲染的调用或模板本身指定您不应包含该模板。 我。 e.
render(... other args..., layout=null)
或 {% noextends "foo.html" %}
这有效地将选择加入方式转变为选择退出方式,根据我的经验,这是首选方式。考虑到它是在设置之类的东西中指定的,它不是“魔法”并且违背了 Django 的精神。
我查看了文档,默认情况下这似乎不可用。 我想我可以做一些事情,比如覆盖内置渲染例程来尝试将
{% extends "foo.html" %}
调用连接到每个模板,但我希望互联网可以告诉我已经有一个我缺少的解决方案。
除非您想编写自己的模板加载器函数来查找默认设置并对其进行猴子修补,否则“不,没有办法做到这一点”是准确的。
至少每个文件只有一行。
另外,作为一个长期存在的 Django 约定,其他开发人员将立即能够看到使用了哪个基本模板(在更复杂的项目中,您可能会发现您使用不同的基本模板,具体取决于用户类型)。
最后,正如 Python 的禅宗所说,显式优于隐式。 :-)
不要忘记,这是 Python 中的指导原则 - 因此也是 Django 中的指导原则 - 显式优于隐式。因此,尽管 Rails 强调约定优于配置并且让各种事情自动发生,但这与 Python 的做事方式非常陌生。
所以不,没有办法让 Django 让模板自动从基础继承。虽然您可能可以通过创建自定义模板加载器来实现这一点,但这不是一个好主意,因为它会让其他查看您项目的人感到困惑。
此解决方案接近于拥有“默认”模板,但又不使其完全隐式。
someapp/templates/template.html
:
{% extends BASE_TEMPLATE %}
yourproject/settings.py
:
DEFAULT_BASE_TEMPLATE = "yourbasetemplatesapp/templates/yourbasetemplatesapp/base.html"
TEMPLATES = { # ...
"OPTIONS": { # ...
"context_processors": [ # ...
"yourbasetemplatesapp.context_processors.add_default_base_template"
]}}
yourbasetemplatesapp/context_processors.py
:
def add_default_base_template(request):
return {"BASE_TEMPLATE": settings.DEFAULT_BASE_TEMPLATE}
你尝试过吗
{% include "foo.html" %}