Всегда включать пользователя в контекст шаблона django
Я работаю на небольшом сайте интрасети для небольшой компании, где пользователь должен иметь возможность публиковать сообщения. Я представил очень простой механизм аутентификации, когда люди просто вводят свой адрес электронной почты и отправляют уникальный URL-адрес для входа, который устанавливает cookie, который всегда будет идентифицировать их для будущих запросов.
В моей настройке шаблона у меня есть base.html, и другие страницы расширяют это. Я хочу показать вход в систему или кнопку регистрации в файле base.html, но как я могу гарантировать, что необходимые переменные всегда являются частью контекста? Кажется, что каждый взгляд только устанавливает контекст по своему усмотрению, и глобальная контекстная популяция отсутствует. Есть ли способ сделать это без включения пользователя в каждое создание контекста?
Или мне нужно сделать собственные собственные ярлыки для правильной настройки контекста?
Ответы
Ответ 1
В более общем смысле, не имея явно заданных переменных в каждом представлении, похоже, что вы хотите посмотреть на свой собственный контекстный процессор.
Из документов:
Контекстный процессор имеет очень простой интерфейс: это просто функция Python, которая принимает один аргумент, объект HttpRequest и возвращает словарь, который добавляется в контекст шаблона. Каждый процессор контекста должен возвращать словарь.
Ответ 2
Нет необходимости писать текстовый процессор для объекта пользователя, если у вас уже есть "django.core.context_processors.auth"
в TEMPLATE_CONTEXT_PROCESSORS
и, если вы используете RequestContext
в ваших представлениях.
если вы используете django 1.4 или последний модуль был перемещен на django.contrib.auth.context_processors.auth
Ответ 3
@Ryan: Документация о препроцессорах немного мала
@Staale: добавление пользователя в контекст каждый раз, когда вы вызываете шаблон в поле зрения, 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 }}
Ответ 4
Подсказки в каждом ответе, но еще раз, от "нуля", для новичков:
данные аутентификации в шаблонах (почти) по умолчанию - с небольшим трюком:
в 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не используется.
Ответ 5
Если вы можете подключить свою аутентификацию к схеме аутентификации Django, вы сможете использовать request.user
.
Я думаю, что это должен быть случай вызова authenticate()
и login()
на основе содержимого вашего Cookie.
Изменить: @Staale - я всегда использую locals()
трюк для моего контекста, поэтому все мои шаблоны могут видеть request
и так далее request.user
. Если вы этого не сделаете, я думаю, это было бы не так просто.
Ответ 6
@Dave
Чтобы использовать {{user.username}} в моих шаблонах, мне придется использовать
requestcontext, а не просто нормальный map/hash: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext
Итак, я думаю, что нет никаких глобальных переменных, которые проверяет механизм шаблонов.
Но у RequestContext есть некоторые классы prepopulate, которые я могу изучить, чтобы решить мои проблемы. Спасибо.
Ответ 7
его возможно по умолчанию, выполнив следующие шаги, убедитесь, что вы добавили в свои настройки контекст "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',)
И вы можете получить доступ к объекту пользователя, подобному этому,
{% 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