Всегда включать пользователя в контекст шаблона django - PullRequest
29 голосов
/ 03 сентября 2008

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

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

Или мне придется создавать собственные ярлыки для правильной настройки контекста?

Ответы [ 7 ]

43 голосов
/ 30 июня 2009

Нет необходимости для написания контекстного процессора для объекта пользователя, если у вас уже есть "django.core.context_processors.auth" в TEMPLATE_CONTEXT_PROCESSORS , если вы используете RequestContext в своих представлениях.

если вы используете django 1.4 или более позднюю версию, модуль был перемещен в django.contrib.auth.context_processors.auth

33 голосов
/ 06 ноября 2008

@ Райан: Документация о препроцессорах немного мала

@ 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 }}
18 голосов
/ 03 сентября 2008

В более общем смысле отсутствия необходимости явно устанавливать переменные в каждом представлении, это звучит так, как будто вы хотите посмотреть на написание собственного контекстного процессора .

Из документов:

У контекстного процессора очень простой интерфейс: это просто функция Python, которая принимает один аргумент, объект HttpRequest и возвращает словарь, который добавляется в контекст шаблона. Каждый контекстный процессор должен возвращать словарь.

3 голосов
/ 09 августа 2012

Подсказки есть в каждом ответе, но еще раз, с «нуля», для новичков:

данные аутентификации по умолчанию в шаблонах (почти) - с небольшим фокусом:

в views.py:

from django.template import RequestContext
...
def index(request):
    return render_to_response('index.html', 
                              {'var': 'value'},
                              context_instance=RequestContext(request))

in index.html:

...
Hi, {{ user.username }}
var: {{ value }}
... 

Отсюда: https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates

Эта переменная контекста шаблона недоступна, если RequestContext не используется.

2 голосов
/ 03 сентября 2008

@ Dave Чтобы использовать {{user.username}} в моих шаблонах, мне нужно будет использовать requestcontext, а не просто карта норм / хэш: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext

Так что я думаю, что нет глобальных переменных, которые проверяет движок шаблонов.

Но в RequestContext есть несколько классов, которые можно заранее заполнить, чтобы я мог решить свои проблемы. Спасибо.

2 голосов
/ 03 сентября 2008

Если вы можете подключить вашу аутентификацию к схеме Django , вы сможете использовать request.user.

Я думаю, что это просто случай вызова authenticate() и login() в зависимости от содержимого вашего Cookie.

Редактировать: @Staale - я всегда использую locals() трюк для своего контекста, чтобы все мои шаблоны могли видеть request и так request.user. Если нет, то я думаю, это было бы не так просто.

1 голос
/ 27 января 2011

это возможно по умолчанию, выполнив следующие шаги, убедитесь, что вы добавили контекст '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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...