Дополнительный контекст не передается в /учетные записи/логин в django 3

#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. Спасибо, что нашли время записать это. Это очень проницательно.