Как использовать пользовательский тег шаблона в base.html

#django #django-templates

#django #django-шаблоны

Вопрос:

. это корень моего проекта, где manage.py он находится. У меня есть базовый шаблон по адресу ./templates/base.html . У меня есть пользовательский тег шаблона в ./app/templatetags/mytags.py

 from django import template

register = template.Library()

@register.unread_tag
def get_unread(user):
    return user.notification_set.filter(viewed=False).count()
  

Как мне сделать этот тег пригодным для base.html , от которого наследуются все шаблоны уровня приложения.

Комментарии:

1. Вы пытались поместить {% load mytags %} в начало base.html ?

2. {% load mytags %} дает мне 'Library' object has no attribute 'unread_tag'

Ответ №1:

Ваше определение тега неверно. Вам нужно использовать register.simple_tag декоратор:

 @register.simple_tag(name='unread')
def get_unread(user):
    return user.notification_set.filter(viewed=False).count()
  

Затем вам нужно load вставить тег в шаблон:

 {% load mytags %}
  

Затем вы можете использовать тег в шаблоне:

 {% unread request.user %}
  

Комментарии:

1. Я использую как {% непрочитанный запрос.user %} Я получаю сообщение об ошибке, что он принимает два аргумента и предоставляется только 1. При удалении request.user и перезапуске сервера разработки ошибка остается прежней.

2. Спасибо. С другой стороны, я получаю 'str' object has no attribute 'notification_set' то, что выбрасывается в строку return user.notification_set.filter(viewed=False).count() . В оболочке, когда я пытаюсь u.notification_set.filter(viewed=False).count() , где u является экземпляром пользователя, я получаю правильный ответ. Знаете ли вы, почему?

Ответ №2:

Довольно старый вопрос, но с тех пор, как это было задано, все изменилось.
Вы можете загрузить пользовательский тег для ВСЕХ шаблонов в рамках проекта settings.py , используя ключ builtins в OPTIONS settings.TEMPLATES

 TEMPLATES = [{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [
        os.path.join(BASE_DIR, 'templates'),
    ],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
        'builtins': [
            'app.templatetags.mytags',
        ],
    },
}]
  

Вы можете прочитать больше о параметрах в Django doc — DjangoTemplates встроенных бэкэндов.

Эта опция поддерживается начиная с Django 1.9.