Django Как сделать так, чтобы теги шаблона проекта были общими для всех моих приложений в этом проекте

Второй раз спрашиваю подробнее ...

Я хотел бы иметь каталог 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 для загрузки.


person un33k    schedule 21.05.2009    source источник


Ответы (5)


Я не знаю, правильный способ сделать это, но в своих приложениях Django я всегда помещаю общие теги шаблонов в lib "приложение", например:

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

Просто не забудьте добавить приложение lib в список INSTALLED_APPS в settings.py.

person mipadi    schedule 21.05.2009
comment
Обычно я называю приложение в честь проекта: project_core - но такое же решение. - person Carl Meyer; 21.05.2009
comment
как вы это называете в html файлах? Только 1_? - person andilabs; 16.07.2014
comment
@andi: Да, вот и все. - person mipadi; 16.07.2014
comment
Имя модуля внутри tempaltetags совпадает с именем пакета / приложения (например, lib.py). - person Mohammad Torkashvand; 28.02.2016
comment
Не знаю, является ли это правильным способом, но это самое умное решение, с которым я столкнулся, пытаясь справиться с этим. Это заставляет меня понять, что приложения в django могут быть метаприложениями, а не просто строго соответствовать функциональности проекта ... - person logicOnAbstractions; 13.02.2021

Начиная с Django 1.9, больше нет необходимости создавать дополнительное common приложение, как упоминалось ранее. Все, что вам нужно сделать, это добавить путь к директории вашего проекта templatetags в OPTION['libraries'] dict settings.py.

После этого эти теги будут доступны на протяжении всего вашего проекта. Папку templatetags можно разместить где угодно, а также у нее может быть другое имя.

Настроенный пример из документов Django :

OPTIONS={
    'libraries': {
        'myapp_tags': 'path.to.myapp.tags',
        'project_tags': 'project.templatetags.common_extras',
        'admin.urls': 'django.contrib.admin.templatetags.admin_urls',
    },
}
person David Viktora    schedule 05.01.2017
comment
Чтобы было понятнее, в шаблоне html, где этот тег вызывается, нужно сначала {% load project_tags %}, прежде чем вызывать тег, обычно используя {% common_extras %}. - person Hakim; 05.08.2017
comment
All you need to do is to add a path to your project не могли бы вы подробнее рассказать об этой части и привести пример структуры проекта, показывающий, что каталог templatetags не находится внутри приложения? - person User; 13.06.2018
comment
Кажется, у меня это работает для каталога templatetags на том же уровне manage.py. Используя 'mytest_tags': 'templatetags.mytest_tags'. У меня есть __init.py__ внутри каталога templatetags, а также файл python с именем mytest_tags.py - person User; 13.06.2018
comment
Добавьте общедоступное приложение для всех распространенных тегов шаблонов и функций. Этот вариант мне подходит. Django версии 2.17 - person Yi Yang Apollo; 07.03.2019

Django регистрирует теги шаблонов глобально для каждого приложения в INSTALLED_APPS (и поэтому ваше решение не работает: проект не является приложением в понимании Django) они доступны во всех шаблонах ( при условии, что они были должным образом зарегистрированы).

Обычно у меня есть приложение, которое обрабатывает разные функции (например, стартовую страницу сайта) и помещает туда теги шаблонов, не относящиеся к какому-либо конкретному приложению, но это чисто косметическое действие.

person zgoda    schedule 21.05.2009

Это то место, куда вы помещаете его в 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',
            }
        },
    },
]
person Tony    schedule 20.10.2020

Django работает через приложение. Они указаны в настройке INSTALLED_APPS.

Я предлагаю вам разделить все, что связано с другим приложением. Для решения проблемы шаблонных тегов вы можете создать приложение под названием common_tags. Затем настройте параметры INSTALLED_APPS, чтобы использовать его, и вы сможете загружать свои общие теги из любых шаблонов, например:

{% load XXXX %}
person FlogFR    schedule 17.10.2014