3

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

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

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

4

4 回答 4

12

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

首先,为 jinja2 启用自定义环境,如此处所述

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

`模板= [
        {
            "BACKEND": "django_jinja.backend.Jinja2",
            “APP_DIRS”:是的,
            “选项”: {
                "match_extension": ".jinja",
                “环境”:“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 %}

请注意,您必须将请求作为参数传入

于 2015-06-17T09:33:28.693 回答
3

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

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

于 2015-05-19T19:28:32.433 回答
1

有一张票 24694关于添加对OPTIONS['context_processors']Jinja2 模板后端的支持。

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

于 2015-05-14T18:32:13.890 回答
0

使用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",
            ],
        }
    },

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

于 2020-04-26T01:23:25.160 回答