Дополнительный контекст не передается в /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 довольно хорошо освещает этот вопрос. Посмотрите:

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