#django #django-3.2
Вопрос:
Я хочу передать некоторые настраиваемые данные в шаблон входа в систему и во все остальные шаблоны учетных записей.
В настоящее время я пытаюсь сделать это так:
# 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)
Ответ №1:
Почему это не работает?
Нет никаких причин, по которым это было бы добавлено в контекст шаблона — просто этот конкретный аргумент работает не так. (Обычно он используется для добавления дополнительных аргументов при вызове представления, но они не добавляются автоматически в контекст шаблона — это зависит от вас внутри представления!!).
Как лучше это сделать
К счастью, в 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 довольно хороши в этом вопросе. Проверять:
Комментарии:
1. Спасибо, что нашли время записать это. Это очень проницательно.