如何将 Django 消息框架与 Jinja2 和 Django 1.8 中的内置 Jinja2 后端一起使用?
我像以前一样尝试过,但后来想起 Jinja2 后端没有 Django 模板语言的上下文处理器。是否可以通过请求与会话一样。
我只用了几个月的 Django,所以即使答案很明显,也请告诉我。
如何将 Django 消息框架与 Jinja2 和 Django 1.8 中的内置 Jinja2 后端一起使用?
我像以前一样尝试过,但后来想起 Jinja2 后端没有 Django 模板语言的上下文处理器。是否可以通过请求与会话一样。
我只用了几个月的 Django,所以即使答案很明显,也请告诉我。
为了扩展上面的答案,这里是分步细分。
首先,为 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 %}
请注意,您必须将请求作为参数传入
最后我决定使用 Jinja2 环境。我在环境中添加了一个全局可调用对象,例如“messages”:messages.get_messages,它可以让我像上下文处理器一样访问它,但是使用消息(请求)而不是 DTL 中的对象“消息”。
对于像我这样对 Jinja2 不太了解的初学者,我将这个 callable 添加到 jinja2.py 文件中,我们创建该文件是为了启用 Jinja2 后端,就在 callable for url 的下方。您还必须在此文件中从 django.contrib 导入消息模块。现在,您可以通过使用消息(请求)访问 Jinja2 模板来访问消息存储。
有一张票 24694关于添加对OPTIONS['context_processors']
Jinja2 模板后端的支持。
讨论中的一个建议(它很长!)是使用django-jinja。
使用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",
],
}
},
这样做会将消息上下文合并到模板上下文中。