Вопрос

Я работаю над небольшим сайтом в интрасети для небольшой компании, где пользователь должен иметь возможность размещать публикации.Я представил себе очень простой механизм аутентификации, при котором люди просто вводят свой адрес электронной почты, и им отправляется уникальный 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top