如何在Django 1.8中使用带有Jinja2的Django消息框架和内置的Jinja2后端?
我尝试过像以前一样,但后来记得Jinja2后端没有Django Templating Language的上下文处理器。是否可以通过会话请求。
我一直在使用Django几个月,所以即使答案很明显,请告诉我。
答案 0 :(得分:11)
为了扩展上面的答案,这是一步一步的细分。
首先,为jinja2 as described here
启用自定义环境在settings.py中,将jinja2的环境选项指向某个功能
`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 %}
请注意,您必须将请求作为参数传递
答案 1 :(得分:3)
最后我决定使用Jinja2环境。我添加了一个全局可调用的环境,如'messages':messages.get_messages ,这将让我像上下文处理器一样访问它,但使用消息(请求)而不是DTL中的对象'消息'。
对于像我这样对Jinja2不太了解的初学者,我将这个callable添加到jinja2.py文件中,我们创建该文件用于启用Jinja2后端,就在url的callable之下。您还必须从此文件中的django.contrib导入消息模块。现在,您可以使用消息(请求)访问Jinja2模板中的消息存储。
答案 2 :(得分:1)
有一个ticket 24694关于将OPTIONS['context_processors']
的支持添加到Jinja2模板后端。
讨论中的一个建议(它很长!)是使用django-jinja。
答案 3 :(得分: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",
],
}
},
执行此操作会将消息上下文合并到模板上下文中。