Инфраструктура сообщений Django со встроенным бэкэндом Jinja2
Как я могу использовать среду сообщений Django с Jinja2 и встроенным бэкэндом Jinja2 в Django 1.8?
Я попытался сделать это, как и раньше, но потом вспомнил, что бэкэнд Jinja2 не имеет контекстных процессоров Django Templating Language. Это возможно через запрос, как с сеансом.
Я использую Django только в течение нескольких месяцев, поэтому, даже если ответ очевиден, пожалуйста, дайте мне знать.
3 ответа
В конце концов я решил пойти со средой Jinja2. Я добавил глобальную функцию, вызываемую в среду, такую как 'messages': messages.get_messages, которая позволит мне обращаться к ней как к контекстному процессору, но с сообщениями (запросом) вместо объекта 'messages' в DTL.
Для начинающих, таких как я, которые мало знают о Jinja2, я добавил этот вызываемый объект в файл jinja2.py, который мы создаем для включения бэкэнда Jinja2, чуть ниже вызываемого для url. Вы также должны импортировать модуль сообщений из django.contrib в этом файле. Теперь вы можете получить доступ к хранилищу сообщений из шаблона Jinja2, обратившись к нему с помощью сообщений (запрос).
Чтобы немного расширить ответ выше, вот пошаговая разбивка.
Сначала включите пользовательскую среду для jinja2, как описано здесь
В settings.py укажите параметр среды для jinja2 на какую-то функцию
`ШАБЛОНЫ = [ { "BACKEND": "django_jinja.backend.Jinja2", "APP_DIRS": правда, "ОПЦИИ": { "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 %}
Обратите внимание, что вы должны передать запрос в качестве аргумента
Есть билет 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",
],
}
},
Это приведет к объединению контекста сообщений с контекстом шаблона.