2012-04-15 4 views
9

На мой взгляд, я могу распечатать request.user.username, однако в шаблоне {{request.user.username}} не появляются. Чтобы сделать это легко, я удалил логику из функции, и я импортирую render_to_response & RequestContext.Django 1.4 - {{request.user.username}} не отображается в шаблоне

from django.shortcuts import render_to_response 
from django.template import RequestContext 

@login_required 
@csrf_protect 
def form(request): 
    print request.user.username 
    data = {} 
    return render_to_response('form.html', data, context_instance=RequestContext(request)) 

Я полагаю, что у меня проблемы с моими настройками.

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    # Uncomment the next line for simple clickjacking protection: 
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware', 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django.contrib.admin', 
    'django.contrib.admindocs', 
    'src', 
) 

Заранее спасибо за ваш Помощь-

ответ

37

Как mentioned in the documentation объект аутентифицированного пользователя хранится в user переменной в шаблонах. Указанная документация включает в себя следующий пример:

При визуализации шаблона RequestContext, вошедшего в систему пользователя, либо User экземпляр или AnonymousUser экземпляр, хранящийся в переменной шаблона {{ user }}:

{% if user.is_authenticated %} 
    <p>Welcome, {{ user.get_username }}. Thanks for logging in.</p> 
{% else %} 
    <p>Welcome, new user. Please log in.</p> 
{% endif %} 

EDIT: Благодаря @buffer, который откопал этот старый ответ, я обновил его с последним состоянием. Когда он был изначально написан, менее чем через месяц после Django 1.4 (который был выпущен в конце марта 2012 года), это было правильно. Но поскольку Django 1.5, правильный метод для получения имени пользователя, нужно вызвать get_username() на экземпляр модели пользователя. Это было добавлено из-за возможности обмена классом User (и пользовательское поле в качестве имени пользователя).

+0

Я могу передать объект пользователя шаблону, но не должен ли доступ к пользователю входа через запрос? Кажется, запрос недоступен из шаблона, но находится в представлении. – Emile

+0

Хорошо интересно. Это правильно - вместо {{request.user.username}} (который я использовал в предыдущих проектах), {{user.username}} работает. Спасибо за помощь @tadeck! – Emile

+0

Предпочтительно использовать 'user.get_username' над' user.username': https://docs.djangoproject.com/en/dev/ref/contrib/auth/#django.contrib.auth.models.User.get_username – Medorator

5

Ознакомьтесь с документацией для RequestContext и TEMPLATE_CONTEXT_PROCESSORS.

Если вы хотите, чтобы request был в вашем контексте шаблона, тогда вам нужно включить django.core.context_processors.request в настройках TEMPLATE_CONTEXT_PROCESSORS. По умолчанию это не так.

Однако, как Tadeck отметил в своем ответе user уже доступен, если вы используете настройки по умолчанию, так как django.contrib.auth.context_processors.auth является частью списка по умолчанию для TEMPLATE_CONTEXT_PROCESSORS.

+0

Спасибо за разъяснение Брайана. Это часть информации, которую мне не хватало. Были ли удалены TEMPLATE_CONTEXT_PROCESSORS из проектов по умолчанию? Возможно, я просто забыл, что добавил, но это было давно. – Emile

+0

@EmilePetrone Я не думаю, что текущая команда startproject создает параметр settings.py с 'TEMPLATE_CONTEXT_PROCESSORS'. Возможно, это было когда-то, но я не уверен. –

+0

@BrianNeal: Я не хочу передавать пользователя в шаблоны. Есть ли способ отключить его навсегда? – user1050619

Смежные вопросы