内置 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",
],
}
},
这样做会将消息上下文合并到模板上下文中。
如何将 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",
],
}
},
这样做会将消息上下文合并到模板上下文中。