2012-04-15 21 views
9

A mio avviso, posso stampare request.user.username, tuttavia nel modello, {{request.user.username}} non apparire. Per semplificare, ho rimosso la logica dalla funzione e sto importando render_to_response & RequestContext.Django 1.4 - {{request.user.username}} non esegue il rendering nel modello

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

La mia ipotesi è che ho problemi con il mio 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', 
) 

Grazie in anticipo per il vostro help-

risposta

37

Come mentioned in the documentation, oggetto autenticato dell'utente viene memorizzata all'interno user variabili nei template. documentazione di cui comprende il seguente esempio:

Durante il rendering di un modello RequestContext, il momento utente connesso, sia un'istanza User o un AnonymousUser esempio, viene memorizzato nella variabile di modello {{ 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: Grazie a @buffer, che ha estratto questa vecchia risposta, l'ho aggiornata con lo stato più recente. Quando è stato scritto in origine, in meno di un mese dopo Django 1.4 (pubblicato alla fine di marzo 2012), era corretto. Ma dal momento che Django 1.5, il metodo corretto per ottenere il nome utente è chiamare get_username() sull'istanza del modello utente. Questo è stato aggiunto a causa della possibilità di scambiare la classe User (e avere un campo personalizzato come nome utente).

+0

Posso passare un oggetto utente al modello, ma l'utente che ha effettuato l'accesso non dovrebbe essere accessibile tramite la richiesta? Sembra che la richiesta non sia accessibile dal modello, ma è nella vista. – Emile

+0

Ben interessante. Questo è corretto - invece di {{request.user.username}} (che ho usato nei progetti precedenti), {{user.username}} funziona. Grazie per l'aiuto @tadeck! – Emile

+0

È preferibile utilizzare 'user.get_username' su' user.username': https://docs.djangoproject.com/en/dev/ref/contrib/auth/#django.contrib.auth.models.User.get_username – Medorator

5

Consultare la documentazione per RequestContext e TEMPLATE_CONTEXT_PROCESSORS.

Se vuoi request essere nel vostro contesto modello, quindi è necessario includere django.core.context_processors.request nel vostro ambiente TEMPLATE_CONTEXT_PROCESSORS. Non è lì per impostazione predefinita.

Tuttavia, come Tadeck ha sottolineato nella sua risposta user è già disponibile se si utilizza le impostazioni di default, dal momento che django.contrib.auth.context_processors.auth fa parte della lista di default per TEMPLATE_CONTEXT_PROCESSORS.

+0

Grazie per il chiarimento Brian. Questa è l'informazione che mi mancava. I TEMPLATE_CONTEXT_PROCESSORS sono stati rimossi dai progetti predefiniti? Potrei aver appena dimenticato di averli aggiunti, ma è passato un po 'di tempo. – Emile

+0

@EmilePetrone Non penso che l'attuale comando startproject crei un settings.py con 'TEMPLATE_CONTEXT_PROCESSORS'. Potrebbe avere una volta, ma non ne sono sicuro. –

+0

@BrianNeal: Non voglio passare l'utente ai modelli .. C'è un modo per disabilitarlo in modo permanente? – user1050619

Problemi correlati