Контекстный процессор 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)
...
Если он вызывается каким-то автоматизированным процессом, у которого нет объекта запроса, что ж, поскольку вашему процессору даже не нужен запрос, а значения, которые вы используете, являются постоянными, просто передайте их сами из функции.