2012-04-15 18 views
9

Moim zdaniem mogę wydrukować request.user.username, jednak w szablonie {{request.user.username}} nie ma zjawić się. Aby to ułatwić, usunąłem logikę z funkcji i zaimportowałem render_to_response & RequestContext.Django 1.4 - {{request.user.username}} nie wyświetla się w szablonie

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)) 

Zgaduję, że mam problem z moim settings.py.

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', 
) 

Dzięki z góry za help-

Odpowiedz

37

Jak mentioned in the documentation, obiekt uwierzytelniony użytkownik jest przechowywany w zmiennej user w szablonach. Wspomniane dokumenty to następujący przykład:

podczas generowania szablonu RequestContext, obecnie zalogowany użytkownik, albo wystąpienie User lub wystąpienie AnonymousUser jest przechowywany w zmiennej matrycy {{ 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 %} 

EDYCJA: Dzięki @buffer, który wykopał tę starą odpowiedź, zaktualizowałem ją o najnowszy stan. Kiedy został napisany pierwotnie, w niecały miesiąc po Django 1.4 (który został wydany pod koniec marca 2012 roku), to było poprawne. Ale od wersji Django 1.5 właściwą metodą uzyskania nazwy użytkownika jest wywołanie get_username() na instancji modelu użytkownika. Zostało to dodane ze względu na możliwość zamiany klasy User (i mieć niestandardowe pole jako nazwę użytkownika).

+0

Mogę przekazać obiekt użytkownika do szablonu, ale czy zalogowany użytkownik nie powinien być dostępny przez żądanie? Wygląda na to, że żądanie nie jest dostępne z szablonu, ale jest w widoku. – Emile

+0

Dobrze interesujące. To prawda - zamiast {{request.user.username}} (używanego w poprzednich projektach) działa {{user.username}}. Dzięki za pomoc @tadeck! – Emile

+0

Lepiej używać 'user.get_username' przez' user.username': https://docs.djangoproject.com/en/dev/ref/contrib/auth/#django.contrib.auth.models.User.get_username – Medorator

5

Zapoznaj się z dokumentacją dla RequestContext i TEMPLATE_CONTEXT_PROCESSORS.

Jeśli chcesz, aby request był w kontekście szablonu, musisz dodać django.core.context_processors.request w swoim ustawieniu TEMPLATE_CONTEXT_PROCESSORS. Nie ma go domyślnie.

Jednak jak Tadeck wskazał w swojej odpowiedzi user jest już dostępna, jeśli używasz ustawień domyślnych, ponieważ django.contrib.auth.context_processors.auth jest częścią listy domyślnych dla TEMPLATE_CONTEXT_PROCESSORS.

+0

Dzięki za wyjaśnienie Brian. To jest ta informacja, której mi brakowało. Czy TEMPLATE_CONTEXT_PROCESSORS został usunięty z domyślnych projektów? Być może właśnie zapomniałem, że je dodałem, ale minęło trochę czasu. – Emile

+0

@EmilePetrone Nie sądzę, że obecne polecenie startproject tworzy plik settings.py z 'TEMPLATE_CONTEXT_PROCESSORS'. Może kiedyś, ale nie jestem pewien. –

+0

@ BrianNeal: Nie chcę przekazywać użytkownika do szablonów. Czy istnieje sposób na trwałe wyłączenie go? – user1050619