Всегда включая пользователя в контекст шаблона django
-
09-06-2019 - |
Вопрос
Я работаю над небольшим сайтом в интрасети для небольшой компании, где пользователь должен иметь возможность размещать публикации.Я представил себе очень простой механизм аутентификации, при котором люди просто вводят свой адрес электронной почты, и им отправляется уникальный URL-адрес для входа, который устанавливает файл cookie, который всегда будет идентифицировать их для будущих запросов.
В моей настройке шаблона у меня есть base.html, и другие страницы расширяют это.Я хочу показать кнопку "Вход в систему" или "регистрация" в base.html, но как я могу гарантировать, что необходимые переменные всегда являются частью контекста?Кажется, что каждое представление просто настраивает контекст по своему усмотрению, и глобальной совокупности контекста не существует.Есть ли способ сделать это без включения пользователя в каждое создание контекста?
Или мне придется создавать свои собственные ярлыки, чтобы правильно настроить контекст?
Решение
В более общем смысле, поскольку нет необходимости явно устанавливать переменные в каждом представлении, похоже, вы хотите взглянуть на написание своего собственного контекстный процессор.
Из документов:
Контекстный процессор имеет очень простой интерфейс:Это просто функция Python, которая принимает один аргумент, объект HttpRequest, и возвращает словарь, который добавляется в контекст шаблона.Каждый контекстный процессор должен возвращать словарь.
Другие советы
Есть нет необходимости чтобы написать контекстный процессор для объекта user, если у вас уже есть "django.core.context_processors.auth"
в TEMPLATE_CONTEXT_PROCESSORS
и если вы используете RequestContext
в ваших взглядах.
если вы используете django 1.4 или последнюю версию, модуль был перемещен в django.contrib.auth.context_processors.auth
@Райан:Документации о препроцессорах немного мало
@Стаале:Добавление пользователя в контекст каждый раз, когда кто-то вызывает шаблон в представлении, DRY
Решение заключается в использовании препроцессора
A:В ваших настройках добавьте
TEMPLATE_CONTEXT_PROCESSORS = (
'myapp.processor_file_name.user',
)
B:В myapp/processor_file_name.py вставить
def user(request):
if hasattr(request, 'user'):
return {'user':request.user }
return {}
Отныне вы можете использовать функции пользовательских объектов в своих шаблонах.
{{ user.get_full_name }}
Подсказки есть в каждом ответе, но еще раз, с "нуля", для новичков:
аутентификационные данные по умолчанию содержатся в шаблонах (почти) - с небольшой хитростью:
в views.py
:
from django.template import RequestContext
...
def index(request):
return render_to_response('index.html',
{'var': 'value'},
context_instance=RequestContext(request))
в index.html
:
...
Hi, {{ user.username }}
var: {{ value }}
...
Отсюда: https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates
Эта контекстная переменная шаблона недоступна, если RequestContext ( Запрос) является не используемым.
@Dave Чтобы использовать {{user.username}} в моих шаблонах, мне тогда придется использовать requestcontext, а не просто обычную карту / хэш: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext
Так что я предполагаю, что нет глобальных файлов, которые проверяет механизм шаблонов.
Но в RequestContext есть несколько предварительно заполненных классов, которые я могу использовать для решения своих проблем.Спасибо.
Если вы можете подключить свою аутентификацию к Схема аутентификации Django вы сможете использовать request.user
.
Я думаю, что это должен быть просто случай вызова authenticate()
и login()
на основе содержимого вашего файла cookie.
Редактировать:@Staale - Я всегда использую locals()
трюк для моего контекста, чтобы все мои шаблоны могли видеть request
и вот request.user
.Если это не так, то, я думаю, все было бы не так просто.
это возможно по умолчанию, выполнив следующие шаги, убедитесь, что вы добавили контекст "django.contrib.auth.context_processors.auth" в свои настройки.По умолчанию он добавлен в settings.py, поэтому выглядит примерно так
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.auth',)
И вы можете получить доступ к объекту user следующим образом,
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
<p>Welcome, new user. Please log in.</p>
{% endif %}
Для получения дополнительной информации обратитесь сюда http://docs.djangoproject.com/en/1.2/topics/auth/#authentication-data-in-templates