#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.