Дополнительный контекст не передается в /accounts/login в django 3
Я хочу передать некоторые конфигурируемые данные в шаблон входа и все остальные шаблоны учетных записей.
В настоящее время я пытаюсь сделать это следующим образом:
# urls.py
path('accounts/', include('django.contrib.auth.urls'), {'extra_context': {'home_title': settings.HOME_TITLE,
'domain': settings.HOSTNAME}}),
Однако эти данные не подхватываются шаблоном. И эти переменные остаются пустыми строками. Есть ли лучший способ сделать это?
Для других страниц я передаю данные в представлениях следующим образом:
#views.py
def home(request):
context = {'home_title': conf_settings.HOME_TITLE}
return render(request, 'home.html', context)
Почему это не работает?
Нет никаких причин для добавления этого аргумента в контекст шаблона - просто этот конкретный аргумент не работает. (Обычно он используется для добавления дополнительных аргументов при вызове представления, но они не добавляются автоматически в контекст шаблона - это зависит от вас внутри представления!).
Какой лучший способ сделать это
К счастью, в Django есть кое-что, что идеально подходит для этого случая: Контекстные процессоры. Они вставляют дополнительные переменные в контекст каждого шаблона. Это просто функции, которые принимают запрос и возвращают дикту для добавления в контекст. Например:
def my_context_processor(request):
return {
'home_title': settings.HOME_TITLE,
'domain': settings.HOSTNAME
}
и затем в настройках:
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'path.to.my_context_processor'
],
},
},
]
Если вы хотите добавить это только для определенных представлений, вы можете использовать объект request.match
для проверки пространства имен или имени_приложения, например:
# urls.py
path('accounts/', include('django.contrib.auth.urls', namespace="accounts")
def my_context_processor(request):
if request.match.namespace === "accounts":
return {
'home_title': settings.HOME_TITLE,
'domain': settings.HOSTNAME
}
return {}
Для получения дополнительной информации о контекстных процессорах
Документация Django довольно хорошо освещает этот вопрос. Посмотрите: