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

un3*_*33k 30 tags django templates django-templates

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

我想有一个项目范围的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
Run Code Online (Sandbox Code Playgroud)

哪里:

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" %}
Run Code Online (Sandbox Code Playgroud)

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

mip*_*adi 44

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

proj/
    __init__.py
    lib/
        __init__.py
        templatetags/
            __init__.py
            common_tags.py
Run Code Online (Sandbox Code Playgroud)

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

  • `common`或`commons`也可能是一个好名字. (4认同)
  • 我通常在项目之后命名应用程序:"project_core" - 但是同样的解决方案. (2认同)
  • 你如何在 html 文件中调用它?只是`{% load common_tags %}`? (2认同)
  • @andi:是的,就是这样。 (2认同)

Dav*_*ora 20

从Django 1.9开始,不再需要common像其他人提到的那样创建额外的应用程序.所有你需要做的是一个路径项目中添加templatetags目录到settings.pyOPTION['libraries']字典.

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

来自Django文档的自定义示例:

OPTIONS={
    'libraries': {
        'myapp_tags': 'path.to.myapp.tags',
        'project_tags': 'project.templatetags.common_extras',
        'admin.urls': 'django.contrib.admin.templatetags.admin_urls',
    },
}
Run Code Online (Sandbox Code Playgroud)

  • 为了更清楚,在调用此标记的模板html中,在使用`{%common_extras%}`正常调用标记之前,首先需要`{%load project_tags%}`. (2认同)
  • 我似乎让它在与 `manage.py` 相同级别的 `templatetags` 目录中工作。使用 `'mytest_tags': 'templatetags.mytest_tags'`。我在 templatetags 目录中有 `__init.py__` 和一个名为 `mytest_tags.py` 的 python 文件 (2认同)

zgo*_*oda 6

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

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


小智 6

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

“libraries”中的第一个键(本例中为“custom_tags”)应该是您想要在模板中加载的名称。


项目结构

mysite
    - myapp
    - mysite
        - manage.py
        - templatetags
            - custom_tags.py
Run Code Online (Sandbox Code Playgroud)

设置.PY

TEMPLATES = [
    {
        'BACKEND': '....',
        'OPTIONS': {
            'context_processors': [
                ...
            ],
            'libraries': {
                'custom_tags': 'mysite.templatetags.custom_tags',
            }
        },
    },
]
Run Code Online (Sandbox Code Playgroud)