2009-07-07 12 views
1

Ich habe einige Code, der den aktuellen angemeldeten Benutzer erhält.Halten Django Ansichten DRY

userID = request.session.get("_auth_user_id") 
    if userID: 
     loggedin_user = User.objects.get(pk=int(userID)) 
    else: 
     loggedin_user = None 

Ich möchte den Benutzernamen auf jeder Seite angezeigt werden.

Im Moment habe ich in jeder Ansicht den Code bin setzen und zu jeder Vorlage gegen D.R.Y Ethik des django zu gehen

return render_to_response('index.html', {loggedin_user}) 

Dies scheint das Benutzerobjekt übergeben. Wie kann ich das tun, indem ich mich wiederhole?

EDIT: Vielleicht Benutzer war ein schlechtes Beispiel.

Was passiert, wenn ich

items = Item.objects.all() 

und in der Liste auf every eine Liste von Objekten aus der Datenbank erhalten will.

Muss ich diesen Code schreiben und die Liste in jeder Ansicht an die Vorlage übergeben. Oder kann ich einmal Code schreiben, der diese Liste für alle Vorlagen verfügbar macht?

Antwort

1

Sie sollten eine custom template tag für so etwas verwenden. Sie können die benötigten Daten im benutzerdefinierten Tag abrufen und an die Vorlage senden. Alles, was Sie sich merken müssen, ist den Tag-up in der Template-Datei wirst du es in.

+0

aber dann hast du die {% lade mein _template_tag%} in 20 Vorlagen ...Dies ist nicht DRY –

+3

Wenn Sie es häufig verwenden, ist es wahrscheinlich in einer übergeordneten Vorlage, die Sie erweitern, und daher haben Sie es nur an einer Stelle. Wenn dies nicht der Fall ist, könnten Sie wahrscheinlich einen benutzerdefinierten Kontextprozessor verwenden. –

3

Die Benutzer-ID existiert bereits in der Sitzung. Daher müssen Sie es nicht weiter herumreichen.

{{ request.session._auth_user_id }} 

Das sollte funktionieren, aber Sie müssen diese in Ihrer Einstellungsdatei in Ihrem TEMPLATE_CONTEXT_PROCESSORS hinzuzufügen:

django.core.context_processors.request 

In Ihrem render_to_response, dann würden Sie die Anfrage als Parameter hinzufügen müssen. Zum Beispiel:

return render_to_response('test.html',{}, context_instance=RequestContext(request)) 
+0

Leider verwenden zu laden, ich einen Tippfehler machte ich das ganze Benutzerobjekt auf die Vorlage nicht nur die ID übergeben will –

+0

Wieder ist der gesamte Benutzer bereits vorhanden, wenn Sie den Benutzer der Sitzung hinzugefügt haben, sodass Sie auf alle Felder zugreifen können. – AlbertoPL

+1

@Cato: {{user}} ist für jede Vorlage verfügbar, wenn Sie django.core.context_processors.auth in Ihre Einstellungen einfügen.TEMPLATE_CONTEXT_PROCESSORS, aber anonyme Benutzer sind keine None, sie sind Instanzen von AnonymousUser. Siehe http://docs.djangoproject.com/en/dev/topics/auth/#authentication-data-in-templates –

1

Was ist mit request.user?

if request.user.is_authenticated(): 
    name = request.user.username 
else: 
    name = "Anonymous" 

Wie auch immer, wenn es in django nicht bereits vorhanden ist, würde ich Sie vorschlagen, eine Middleware-Klasse zu schreiben wie django.contrib.sessions.middleware.SessionMiddleware oder django.contrib.auth.middleware.AuthenticationMiddleware . Diese Klasse ändert die Anforderungsdetails, bevor sie an eine Ansicht gesendet werden.

Wenn Sie es auf einer Sichtbasis benötigen, könnten Sie einen Dekorateur schreiben, um das kleine bisschen zu tun, und @decorator die Ansichten, die Sie wollen.

Verwandte Themen