默认为所有视图加载一个 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 开始,正确的方法是在 OPTIONSbuiltins 键下配置模板标签和过滤器 - 请参见下面的示例:

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 地图标记

如何根据 Django 中当前基于类的通用视图模型向模板加载器添加路径

Django视图层模板层

从 django 中的视图更新模板标签的值

django特殊的标签和过滤器

Django:使用视图来处理模板标签的逻辑?