内置 Jinja2 后端的 Django 消息框架

Django messages framework with built-in Jinja2 backend

如何将 Django 消息框架与 Jinja2 和 Django 1.8 中的内置 Jinja2 后端一起使用?

我试过像以前那样做,但后来想起 Jinja2 后端没有 Django 模板语言的上下文处理器。是否可以像会话一样通过请求。

我使用 Django 才几个月,所以即使答案很明显,也请告诉我。

ticket 24694 关于向 Jinja2 模板后端添加对 OPTIONS['context_processors'] 的支持。

讨论中的一个建议(很长!)是使用 django-jinja

最后我决定使用 Jinja2 环境。我向环境添加了一个全局可调用对象,例如 'messages': messages.get_messages,这将让我像上下文处理器一样访问它,但带有 消息(request) 而不是 DTL 中的对象 'messages'.

对于像我这样不太了解 Jinja2 的初学者,我将这个可调用文件添加到我们为启用 Jinja2 后端而创建的 jinja2.py 文件中,就在 url 的可调用文件下方。您还必须在此文件中从 django.contrib 导入消息模块。现在,您可以使用 messages(request) 从 Jinja2 模板访问消息存储。

为了进一步扩展上面的答案,这里是分步分解。

首先,为 jinja2 启用自定义环境,as described here

在 settings.py 中,将 jinja2 的 environment 选项指向某个函数

`TEMPLATES = [
        {
            "BACKEND": "django_jinja.backend.Jinja2",
            "APP_DIRS": True,
            "OPTIONS": {
                "match_extension": ".jinja",
                "environment": "myapp.jinjaconfig.environment",
            }
        },
...]`

现在您编写该函数以将消息添加到环境中。创建 myapp/jinjaconfig.py(或您选择的任何名称,以匹配您添加到 settings.py 的内容):

from jinja2 import Environment
from django.contrib import messages

def environment(**options):
    env = Environment(**options)
    env.globals.update({
        'get_messages': messages.get_messages,
        })
    return env

此时您的模板中有 get_messages 可用。你可以这样使用它:

{% for message in get_messages(request) %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}

请注意,您必须将请求作为参数传递给那里

使用 django_jinja 包。

在您的 settings.py 文件中,您可以像下面的示例一样添加 context_processor,无需执行任何其他操作即可运行:

# Just an example
TEMPLATES = [
    {
        "BACKEND": "django_jinja.backend.Jinja2",
        "APP_DIRS": True,
        "OPTIONS": {
            "context_processors": [
                "django.contrib.messages.context_processors.messages",
            ],
        }
    },

这样做会将消息上下文合并到模板上下文中。