Django - 如何在该项目中的所有应用程序之间共享项目范围的模板标签

时间:2009-05-21 00:44:19

标签: django templates django-templates tags

第二次询问更多细节......

我想要一个项目范围的templagetags目录来共同使用 所有应用程序使用的标签,如果需要,每个应用程序都可以拥有自己的标签。

我要说:

proj1/app1
proj1/app1/templatetags/app1_tags.py

proj1/app2
proj1/app2/templatetags/app2_tags.py

proj1/templatetags/proj1_tags.py

proj1/templates/app1/base.html
proj1/templates/app1/index.html
proj1/templates/app2/base.html
proj1/templates/app2/index.html

其中:

proj1/templates/app1/base.html
-----------
{% load proj1_tags %}
{% load app1_tags %}

proj1/templates/app1/index.html
-----------
{% extends "base.html" %}

proj1/templates/app2/base.html
-----------
{% load proj2_tags %}
{% load app2_tags %}

proj1/templates/app2/index.html
-----------
{% extends "base.html" %}

这会有用吗?它对我不起作用。它无法找到要加载的proj1_tags。

5 个答案:

答案 0 :(得分:41)

我不知道这是否是正确的方式,但在我的Django应用中,我总是将常用模板标签放在lib“app”中,就像这样:

proj/
    __init__.py
    lib/
        __init__.py
        templatetags/
            __init__.py
            common_tags.py

只需确保将lib应用添加到INSTALLED_APPS中的settings.py列表中。

答案 1 :(得分:15)

自Django 1.9以来,不再需要像其他人提到的那样创建额外的common应用。您需要做的就是将项目templatetags目录的路径添加到settings.py的{​​{1}} dict。

之后,您可以在整个项目中访问这些标签。 OPTION['libraries']文件夹可以放在您需要的任何位置,也可以有不同的名称。

来自Django docs的自定义示例:

templatetags

答案 2 :(得分:3)

Django为INSTALLED_APPS中的每个应用程序全局注册模板标签(这就是为什么你的解决方案不起作用的原因:项目不是Django所理解的应用程序) - 它们在所有模板中都可用(只要它们已正确注册)。

我通常有一个处理杂项功能的应用程序(如网站的起始页面),并且将模板标签与任何特定应用程序无关,但这纯粹是装饰性的。

答案 3 :(得分:0)

Django由App工作。它们在INSTALLED_APPS设置中引用。

我建议您拆分与其他应用相关的所有内容。对于templatetags问题,您可以创建一个名为“common_tags”的应用。然后设置INSTALLED_APPS设置以使用它,您将能够从任何模板加载常用标签,如下所示:

{% load XXXX %}

答案 4 :(得分:0)

这是您将其放置在 settings.py 中的位置。

“库”中的第一个键(在这种情况下为“ custom_tags”)应该是您要在模板中加载名称的键。


项目结构

mysite
    - myapp
    - mysite
        - manage.py
        - templatetags
            - custom_tags.py

SETTINGS.PY

TEMPLATES = [
    {
        'BACKEND': '....',
        'OPTIONS': {
            'context_processors': [
                ...
            ],
            'libraries': {
                'custom_tags': 'mysite.templatetags.custom_tags',
            }
        },
    },
]