Подтвердить что ты не робот

Всегда включать пользователя в контекст шаблона django

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

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

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

4b9b3361

Ответ 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