39

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

我想有一个项目范围的 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。

4

5 回答 5

52

我不知道这是否是正确的做法,但在我的 Django 应用程序中,我总是将通用模板标签放在lib“应用程序”中,如下所示:

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

只需确保将lib应用程序添加到您的 in 列表INSTALLED_APPS中即可settings.py

于 2009-05-21T01:04:18.520 回答
32

从 Django 1.9 开始,不再需要common像其他人提到的那样创建额外的应用程序。您需要做的就是将项目templatetags目录的路径添加到settings.py's OPTION['libraries']dict.

之后,这些标签将可以在您的整个项目中访问。该templatetags文件夹可以放置在您需要的任何地方,也可以有不同的名称。

来自Django 文档的定制示例:

OPTIONS={
    'libraries': {
        'myapp_tags': 'path.to.myapp.tags',
        'project_tags': 'project.templatetags.common_extras',
        'admin.urls': 'django.contrib.admin.templatetags.admin_urls',
    },
}
于 2017-01-05T19:00:34.657 回答
7

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

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

于 2009-05-21T08:20:49.880 回答
4

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

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


项目结构

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

设置.py

TEMPLATES = [
    {
        'BACKEND': '....',
        'OPTIONS': {
            'context_processors': [
                ...
            ],
            'libraries': {
                'custom_tags': 'mysite.templatetags.custom_tags',
            }
        },
    },
]
于 2020-10-20T15:45:20.360 回答
-2

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

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

{% load XXXX %}
于 2014-10-17T11:55:24.413 回答