Контекстный процессор Django не отрисовывается из оболочки

Используется Django 3.2

Определил несколько глобальных переменных, например

app/context_processors.py

from app.settings import constants

def global_settings(request):
    return {
        'APP_NAME': constants.APP_NAME,
        'APP_VERSION': constants.APP_VERSION,
        'STATIC_URL_HOST': constants.STATIC_URL_HOST
    }

и в settings.py файле

TEMPLATES = [
    {
        ...
        'OPTIONS': {
            'context_processors': [
                ...
                'app.context_processors.global_settings',
            ],
        },
    },
]

Вы использовали APP_NAME в нижнем колонтитуле шаблона электронной почты, как

templates/account/welcome_message.html

Hi {{ username }},

Welcome to the application.

{{ APP_NAME }}

Когда письмо отправляется с веб-портала, APP_NAME отображается нормально, но когда отправка письма инициируется из оболочки Django

python manage.py shell

> from account.emails import welcome_email
> welcome_email(user)

Тогда APP_NAME не отображается в письме.

Как контекстный процессор может быть отображен и из оболочки?

Контекстный процессор принимает на вход объект HttpRequest, следовательно, чтобы контекстный процессор был запущен, когда вызывается метод шаблона render, необходимо передать ему запрос, как template.render(context, request). Ваша функция welcome_email не принимает запрос и, естественно, не может его передать.

Если эта функция вызывается из некоторого представления, все, что вам нужно сделать, это принять запрос в качестве аргумента и передать его в метод шаблонов render:

def welcome_email(user, request):
    ...
    subject_content = subject_text.render(context, request)
    body_text_content = body_text.render(context, request)
    body_html_content = body_html.render(context, request)
    ...

Если он вызывается каким-то автоматизированным процессом, у которого нет объекта запроса, что ж, поскольку вашему процессору даже не нужен запрос, а значения, которые вы используете, являются постоянными, просто передайте их сами из функции.

Вернуться на верх