Инфраструктура сообщений 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",
            ],
        }
    },

Это приведет к объединению контекста сообщений с контекстом шаблона.

Другие вопросы по тегам