Я работаю над небольшим интранет-сайтом для небольшой компании, где пользователь должен иметь возможность публиковать сообщения. Я придумал очень простой механизм аутентификации, при котором люди просто вводят свой адрес электронной почты и получают уникальный URL-адрес для входа, который устанавливает файл cookie, который всегда будет идентифицировать их для будущих запросов.
В моей настройке шаблона у меня есть base.html, а другие страницы расширяют его. Я хочу показать кнопку авторизации или регистрации в base.html, но как я могу гарантировать, что необходимые переменные всегда являются частью контекста? Кажется, что каждое представление просто настраивает контекст по своему усмотрению, а глобального контекста не существует. Есть ли способ сделать это без включения пользователя в каждое создание контекста?
Или мне придется создавать собственные ярлыки для правильной настройки контекста?






Если вы можете подключить свою аутентификацию к Схема аутентификации Django, вы сможете использовать request.user.
Я думаю, что это должен быть случай вызова authenticate() и login() на основе содержимого вашего файла cookie.
Обновлено: @Staale - я всегда использую locals() трюк для своего контекста, поэтому все мои шаблоны могут видеть request и, следовательно, request.user. Если нет, то, думаю, все было бы не так просто.
В более общем смысле отсутствие необходимости явно устанавливать переменные в каждом представлении, похоже, вы хотите написать свой собственный контекстный процессор.
Из документов:
A context processor has a very simple interface: It's just a Python function that takes one argument, an HttpRequest object, and returns a dictionary that gets added to the template context. Each context processor must return a dictionary.
@ Дэйв Чтобы использовать {{user.username}} в моих шаблонах, мне нужно будет использовать requestcontext, а не просто обычная карта / хэш: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext
Итак, я полагаю, что шаблонизатор не проверяет глобальные объекты.
Но в RequestContext есть несколько предварительно заполненных классов, которые я могу изучить, чтобы решить свои проблемы. Спасибо.
@Ryan: Документация по препроцессорам немного мала.
@Staale: добавление пользователя в контекст каждый раз, когда вызывается шаблон в представлении, DRY
Решение - использовать препроцессор
А: В настройках добавьте
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 }}
@ hobbes3, поскольку вы не используете RequestContext, обработчики контекста не запускаются.
@rebus На самом деле в моем views.py я передал простой словарь, использующий render_to_resposne в отличие от RequestContext. Спасибо за помощь.
Существует нет потребности для написания обработчика контекста для пользовательского объекта, если у вас уже есть "django.core.context_processors.auth" в TEMPLATE_CONTEXT_PROCESSORSи, если вы используете RequestContext в своих представлениях.
если вы используете django 1.4 или более позднюю версию, модуль был перемещен на django.contrib.auth.context_processors.auth
Эта переменная контекста шаблона недоступна, если RequestContext не используется.
Правда надо использовать RequestContext
Используйте render () (docs.djangoproject.com/en/dev/topics/http/shortcuts/#render) из Django 1.3, чтобы всегда автоматически включать RequestContext.
Первая ссылка должна быть: docs.djangoproject.com/en/dev/topics/auth/default/…
это возможно по умолчанию, выполнив следующие шаги, убедитесь, что вы добавили контекст 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
В этом случае вам также необходимо использовать RequestContext вместо Context.
Подсказки есть в каждом ответе, но еще раз «с нуля» для новичков:
данные аутентификации находятся в шаблонах (почти) по умолчанию - с небольшой уловкой:
в 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
This template context variable is not available if a RequestContext is not being used.
Используйте context_processors. https://docs.djangoproject.com/en/2.2/ref/settings/#std:setting-TEMPLATES-OPTIONS
settings.py
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'myapp.functions.test'
],
},
myapp/functions.py
def test(request):
return {'misc': 'misc'}
Django выдает ошибку
Put 'django.contrib.auth.context_processors.auth' in your TEMPLATE_CONTEXT_PROCESSORS setting in order to use the admin application.. И даже если я это сделаю, шаблоны все равно не знают оuser.