【问题标题】:how to use jinja2 in Django 3.1如何在 Django 3.1 中使用 jinja2
【发布时间】:2021-01-25 12:48:24
【问题描述】:

现在我正在使用 Django 3.1 模板引擎,但我对它并不满意。

但是我看到jinja2模板引擎很强大吧。

以为 Django 说它支持 jinja2 模板引擎,我在关注 this Django 文档, 但我不能使用它。

# settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        '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',
            ],
        },
    },
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        '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',
            ],
        },
    }
]

浏览器错误:

("Encountered unknown tag 'url'. Jinja was looking for the following tags: 'endfor' or 'else'. The innermost block that needs to be closed is 'for'.",)

那么,请告诉我该怎么做?

【问题讨论】:

  • 您是如何配置TEMPLATES 设置的?
  • 您应该删除第一个。如果您使用DIRS 指定哪些目录属于哪个模板,则可以使用多个模板。但是这里两者是相同的,这意味着 Django 将始终选择第一个。
  • 它给出了一个错误,即 Django 管理应用程序需要 Django 模板引擎。
  • 你能发布确切的错误吗?究竟要渲染什么页面。对于某些内置的 Django 应用程序,您确实需要另一个模板。您可以在 DIRS 设置中指定这些。

标签: django jinja2


【解决方案1】:

这里是文档:https://niwinz.github.io/django-jinja/latest/

安装 jinja2

pip install django-jinja

添加到 INSTALLED_APPS

INSTALLED_APPS = (
         .......
    'django_jinja',
         .......
)

加入模板引擎列表:

TEMPLATES = [
    {
        "BACKEND": "django_jinja.backend.Jinja2",
        "APP_DIRS": True,
        "OPTIONS": {
           "match_extension": ".jinja",
        }
     },
     {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [],
        "APP_DIRS": True
     },
]

【讨论】:

    【解决方案2】:

    您可以使用多个引擎,但是目录应该不重叠,或者您使用具有给定优先级的引擎,如果您使用DIRS setting [Django-doc] 指定哪些目录属于哪个模板。但是这里两者是相同的,这意味着 Django 将始终选择第一个。

    您因此指定:

    # settings.py
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.jinja2.Jinja2',
            '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',
                ],
            },
        },
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [],
            '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',
                ],
            },
        }
    ]

    因此,我们不会在DjangoTemplatesDIRS 设置中添加任何项目。

    【讨论】:

    • @DevMahdi:你能用'DIRS': []添加Django后端吗(见编辑后的答案)。
    • @DevMahdi:到底是哪些模板标签?请注意,如果您注册自定义模板标签,则应加载这些标签...
    • 遇到未知标签'url'
    • @DevMahdi: 好吧 Jinja 不识别{% url ... %}{% load ... %} 等。见stackoverflow.com/a/55805945/67579
    猜你喜欢
    • 2020-08-04
    • 2012-09-18
    • 2015-07-29
    • 2012-02-12
    • 2011-09-17
    • 2019-11-04
    • 2011-04-08
    • 2015-08-22
    • 2022-10-04
    相关资源
    最近更新 更多