遇到未知标签“加载”。?

Zoe*_*Zoe 2 python django jinja2 django-rest-framework

我想添加一些自定义模板标签。但是,{% load userfilters %} => 'load' 标签不起作用。

  1. 设置.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',
        },
    },
]
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)
  1. 应用程序/templatetags/userfilters.py
from django import template

register = template.Library()


@register.filter(name='a')
def a(value):
    return 1
Run Code Online (Sandbox Code Playgroud)
  1. 视图.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'})
Run Code Online (Sandbox Code Playgroud)
  1. 演示.html

    • 不管用
{% load userfilters %}
<!-- custom filter -->
{{ name|a }}
Run Code Online (Sandbox Code Playgroud)
  • 是工作
<!-- default filter -->
{{ name|title }}
Run Code Online (Sandbox Code Playgroud)

我希望能够解决这个问题。

AKX*_*AKX 5

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

另一种选择是使用django-jinja模板后端而不是 Django 内置的 Jinja2 后端;它的功能更多一些,并且支持templatetags开箱即用的样式加载