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

时间:2009-07-30 10:10:32

标签: django django-templates

[我在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 个答案:

答案 0 :(得分:10)

不,自定义模板代码无法使用django.template.loaders.app_directories.load_template_source

您不必指定目录来告诉django where-from加载 templatetags 库(就像模板一样),只是coz django假定在{中指定的应用程序中找到templatetags库{1}}列表。

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

您可以查看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__列表出现在其中。