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

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

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
32
0
29 085
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Если вы можете подключить свою аутентификацию к Схема аутентификации 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 }}

Django выдает ошибку Put 'django.contrib.auth.context_processors.auth' in your TEMPLATE_CONTEXT_PROCESSORS setting in order to use the admin application.. И даже если я это сделаю, шаблоны все равно не знают о user.

hobbes3 10.03.2012 21:27

@ hobbes3, поскольку вы не используете RequestContext, обработчики контекста не запускаются.

Davor Lucic 10.03.2012 22:55

@rebus На самом деле в моем views.py я передал простой словарь, использующий render_to_resposne в отличие от RequestContext. Спасибо за помощь.

hobbes3 11.03.2012 20:32

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

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

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

zalun 01.07.2009 16:50

Правда надо использовать RequestContext

Davor Lucic 10.03.2012 22:47

Используйте render () (docs.djangoproject.com/en/dev/topics/http/shortcuts/#render‌) из Django 1.3, чтобы всегда автоматически включать RequestContext.

Emil Stenström 27.06.2012 17:01

Первая ссылка должна быть: docs.djangoproject.com/en/dev/topics/auth/default/…

Ron Cohen 24.02.2013 21:53

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

Davor Lucic 10.03.2012 23:06

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

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

в 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'}

Другие вопросы по теме