Обнаружен неизвестный тег ‘load’.?

#python #django #django-rest-framework #jinja2

#python #django #django-rest-framework #jinja2

Вопрос:

Я хочу добавить несколько пользовательских тегов шаблона.Но {% load userfilters %} => тег ‘load’ не работает.

  1. settings.py
 # project/settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [
            os.path.join(BASE_DIR, 'html/jinja2'),
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'environment': 'accountv1.jinja2.environment',
        },
    },
]
  
  1. jinja2.py
 # project/jinja2.py
from django.templatetags.static import static
from django.urls import reverse

from jinja2 import Environment


def environment(**options):
    env = Environment(**options)
    env.globals.update({
        'static': static,
        'url': reverse,
    })
    return env
  
  1. app/templatetags/userfilters.py
 from django import template

register = template.Library()


@register.filter(name='a')
def a(value):
    return 1
  
  1. views.py
 # use django-rest-framework
class IndexView(generics.GenericAPIView):
    renderer_classes = [TemplateHTMLRenderer]
    template_name = 'index.html'

    def get(self, request, *args, **kwargs):
        return Response({'name': 'max'})
  
  1. demo.html

    • не работает
 {% load userfilters %}
<!-- custom filter -->
{{ name|a }}
  
  • это работа
 <!-- default filter -->
{{ name|title }}
  

Я надеюсь решить эту проблему.

Ответ №1:

В Jinja2 нет load тега, и фильтры тоже работают немного по-другому (это просто функции).

templatetags/*.py это соглашение о шаблонах Django, и Jinja2 их вообще не использует.

Вы захотите зарегистрировать свои фильтры там, где вы настраиваете свою среду:

 def environment(**options):
    env = Environment(**options)
    env.globals.update({
        'static': static,
        'url': reverse,
    })
    env.filters.update({
        'a': a,
    })
    return env
  

Другой вариант — использовать django-jinja серверную часть шаблона вместо встроенной в Django серверной части Jinja2; это немного более функционально и поддерживает templatetags загрузку стиля из коробки.