默认为所有视图加载一个 Django 模板标签库
Posted
技术标签:
【中文标题】默认为所有视图加载一个 Django 模板标签库【英文标题】:Load a Django template tag library for all views by default 【发布时间】:2010-11-14 04:10:21 【问题描述】:我有一个与排版相关的小型模板标签库,我几乎在每个页面上都使用它。现在我需要为每个模板加载它使用
% load nbsp %
有没有办法一次为所有视图和模板“全局”加载它?将加载标签放入基本模板是行不通的。
【问题讨论】:
【参考方案1】:django.template.loader
中有一个add_to_builtins
方法。只需将模板标签模块的名称(作为字符串)传递给它。
from django.template.loader import add_to_builtins
add_to_builtins('myapp.templatetags.mytagslib')
现在mytagslib
可以在任何模板中自动使用。
【讨论】:
请注意,虽然您可以这样做,但您很可能会在某个时候后悔(我已经这样做了,并且后悔了)。它使您的模板不可移植到任何其他没有 add_to_builtins 的项目,并且它可以破坏呈现这些模板的测试(除非您确保测试运行程序也运行 add_to_builtins)。总而言之,它让事情变得更脆弱,只是为了方便一点。 更不用说任何新开发人员都会对您使用标准库中不存在的标签感到困惑,直到他们问您(如果您还在附近)或绊倒至此。 :) 请记住,显式优于隐式。 我们可以用它来覆盖默认的 firstof 和循环标签,这些标签是 XSS 错误的吗? code.djangoproject.com/ticket/17906 其实我现在正在使用% filter force_escape %% firstof var1 var2 var3 "fallback value" %% endfilter %
解决方案。
使用下面给出的新导入路径,这种方法似乎仍然有效:from django.template.base import add_to_builtins【参考方案2】:
它将随着 Django 1.9 的发布而改变。
从 1.9 开始,正确的方法是在 OPTIONS
的 builtins
键下配置模板标签和过滤器 - 请参见下面的示例:
TEMPLATES = [
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS':
'builtins': ['myapp.builtins'],
,
,
]
详情: https://docs.djangoproject.com/en/dev/releases/1.9/#django-template-base-add-to-builtins-is-removed
【讨论】:
到目前为止(Django 1.9),这应该是公认的答案。'builtins': ['django.templatetags.i18n'],
哦耶。
我不确定如何将此选项链接到我的实际模板标签文件 - 如果我需要向我的模板标签文件添加任何内容以将其注册为内置文件。没有关于 django 的文档。任何人都可以友善并编辑此答案以提供完整的详细信息。?谢谢【参考方案3】:
在 django 1.7 中只需替换为 from django.template.base import add_to_builtins
【讨论】:
为什么投反对票?这节省了我的时间,因为接受的答案已经过时了! Django 1.7 中的导入路径已更改。谢谢bsao! 这应该是对existing answer 的评论还是编辑?它本身没有意义。【参考方案4】:在 Django 1.9 中有一个 libraries
标签字典和模板标签模块的虚线 Python 路径,用于向模板引擎注册。这可用于添加新库或为现有库提供替代标签。
TEMPLATES = [
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS':
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
'libraries': # Adding this section should work around the issue.
'custom_tags' : 'myapp.templatetags.custom_tags',#to add new tags module.
'i18n' : 'myapp.templatetags.custom_i18n', #to replace exsiting tags modile
,
,
,
]
【讨论】:
以上是关于默认为所有视图加载一个 Django 模板标签库的主要内容,如果未能解决你的问题,请参考以下文章
在 Javascript 中使用 DJango 模板标签添加 Google 地图标记