Django 自定义模板标签和模板加载器

Posted

技术标签:

【中文标题】Django 自定义模板标签和模板加载器【英文标题】:Django custom template tags and template loaders 【发布时间】:2010-11-15 09:28:50 【问题描述】:

[我在http://groups.google.com/group/django-users/browse_thread/thread/989c569d5118980d]有这个讨论

是 'django.template.loaders.app_directories.load_template_source' 在 TEMPLATE_LOADERS 设置中需要自定义模板标签 工作?

我们知道,只要在 Django 应用程序的 templatetags 目录中添加一个自定义标签,就可以在应用程序中使用该标签。

在加载模板的情况下,我们知道在 TEMPLATE_LOADERS 设置中包含“django.template.loaders.filesystem.load_template_source”在 TEMPLATE_DIRS 中的适当条目使 Django 能够从指定的目录。这是非常清楚和合乎逻辑的。但在自定义模板标签的情况下,我看到它们变得神奇可用。

那么您知道如何找到/加载/处理自定义模板标签吗?

【问题讨论】:

【参考方案1】:

不,自定义模板标签完全不需要django.template.loaders.app_directories.load_template_source

您不必指定目录来告诉 django 从哪里加载 templatetags 库(就像我们在模板的情况下所做的那样),只是因为 django 假定在 @ 指定的应用程序中查找 templatetags 库987654322@名单。

它只是遍历INSTALLED_APPS 的应用程序列表,从其中的“templatetags”目录中导入所有库,并导入每个库以使它们可用。如果找不到名为 templatetags 的目录,它就会跳过。但是,它确实会尝试查看 INSTALLED_APPS 中的所有可用选项。

您可以查看django/templatetags/__init__.py 中的代码,您将了解模板标签是如何(神奇地)可用的。看代码,

from django.conf import settings

for a in settings.INSTALLED_APPS:
    try:
        __path__.extend(__import__(a + '.templatetags', , , ['']).__path__)
    except ImportError:
        pass

它只是将这些模块列表添加到__path____path__ 列出的任何内容都将被视为它也作为其出现在 __path__ 列表中的模块的子模块存在。

【讨论】:

以上是关于Django 自定义模板标签和模板加载器的主要内容,如果未能解决你的问题,请参考以下文章

Jinja - 加载自定义模板标签集

自定义标签未加载到模板中

在自定义模板标签中解析 Django 自定义模板标签

django自定义模板标签和过滤器

接受布尔参数的 Django 自定义模板标签

Django之博客系统:自定义模板标签