2009-06-28 3 views
6

Ich schreibe kleine soziale Anwendung. Eine der Funktionen besteht darin, den Benutzernamen in die Kopfzeile der Site zu schreiben. Also zum Beispiel, wenn ich eingeloggt bin und mein Name ist Oleg (Benutzername), dann sollte ich sehen:Django: Wie schreibe ich aktuelle Benutzer Name aus jeder Ansicht (Django)

Hallo, Oleg | Klicken Sie auf Profil bearbeiten

Ansonsten sollte ich sehen so etwas wie:

Hallo Bitte melden Sie sich ein oder melden Sie

Was ich will, ist dies von meiner Seite auf jeder Seite zu zeigen. Die offensichtliche Lösung besteht darin, das request.user-Objekt in jede Ansicht meiner Site zu übergeben. Aber hier http://www.willmer.com/kb/category/django/ las ich, dass ich einfach Request-Objekt von jeder Vorlage zugreifen kann, nur indem es:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request', 
) 

nicht sicher, warum, aber es hat tatsächlich funktioniert nicht :(

Vielleicht kann mir jemand helfen und eine Lösung vorschlagen?

vielen Dank,

Oleg

Antwort

7

Beachten Sie auch, dass Sie anstelle von django.core.context_processors.request django.core.context_processors.auth verwenden sollten, wenn Sie nicht den gesamten Anfragekontext benötigen. Dann können Sie einfach eingeben:

Hello {{ user.get_full_name }} 

in Ihrer Vorlage.

Vergessen Sie nicht, context_instance=RequestContext(request) zu übergeben, wenn Sie render_to_response anrufen (oder direct_to_template verwenden).

+0

Nur ein kleiner Hinweis: generische Ansichten haben bereits context_instance gesetzt und daher ist die Variable {{user}} bereits verfügbar. –

0

Sobald Sie den Kontext p eingerichtet haben rocess wird die Anforderung an die Vorlage als eine Variable mit dem Namen request übergeben. Um dem Benutzer Zugriff auf Objekt innerhalb die Variable, die Sie benötigen hinein zu bohren:

{{ request.user }} 

Hier ist ein list of attributes stored in the Django Request object. Genauer gesagt, hier ist die user attribute.

1

Verwenden

von django.template Importrequest

statt

aus django.template Import Context

So, jetzt nur nennen Request (Anfrage, Kontext)

Mehr here.

6

Es gibt wahrscheinlich zwei Probleme hier.

Erstens, wenn Sie TEMPLATE_CONTEXT_PROCESSORS neu definieren, wie Sie getan haben, überschreiben Sie den Standard, was wahrscheinlich keine gute Idee ist.Standardmäßig enthält die Einstellung bereits den Prozessor auth, der Ihnen sowieso eine user Variable gibt. Wenn Sie auf jeden Fall die request auch benötigen, sollten Sie dies tun (man beachte die +=):

TEMPLATE_CONTEXT_PROCESSORS += (
    'django.core.context_processors.request', 
) 

Zweitens, wie in der Dokumentation beschrieben here wenn Kontext-Prozessoren verwenden, müssen Sie sicherstellen, dass Sie eine Request in Ihrer Vorlage verwenden . Wenn Sie render_to_response verwenden, sollten Sie es wie folgt tun:

return render_to_response('my_template.html', 
          my_data_dictionary, 
          context_instance=RequestContext(request)) 
0
{% if user.is_authenticated %} 
<p>Welcome, {{ user.username }}. Thanks for logging in.</p> 
{% else %} 
<p>Welcome, new user. Please log in.</p> 
{% endif %} 

genug sein würde, wenn Sie TEMPLATE_CONTEXT_PROCESSORS bereits festgelegt.

0

Ich denke nur durch locals() kann das Problem lösen.

return render_to_response('my_template.html', 
         my_data_dictionary,locals()) 
Verwandte Themen