Keeping Django Ansichten DRY
-
11-09-2019 - |
Frage
Ich habe einige Codes, die aktuellen angemeldeten Benutzer bekommt.
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.
Im Moment habe ich den Code in jeder Ansicht bin setzen und Leiten des Benutzerobjekts zu jeder Vorlage
return render_to_response('index.html', {loggedin_user})
Dies scheint gegen Djangos D.R.Y Ethik zu gehen. Wie kann ich das selbst mit wiederholen?
EDIT: Vielleicht war Benutzer ein schlechtes Beispiel
.Was passiert, wenn ich eine Liste von Objekten aus der Datenbank,
haben wollteitems = Item.objects.all()
und in der Liste auf every.
Muss ich diesen Code schreiben und die Liste der Vorlage in jeder Ansicht übergeben. Oder kann ich schreibe einige Code einmal, wird die Liste auf alle Vorlagen zur Verfügung stellen?
Lösung
Sie sollten eine eigenen Template-Tag rel="nofollow für sowas in der Art. Sie können die Daten, die Sie in dem benutzerdefinierten Tag benötigen holen, und es auf die Vorlage senden. Alles, was Sie sich merken müssen, ist den Tag-up in der Template-Datei Sie gehen, es zu benutzen zu laden in.
Andere Tipps
Der Benutzer-ID existiert bereits in der Sitzung. Als solche müssen Sie nicht zu halten, um vorbei.
{{ 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 brauchen die Anforderung als Parameter hinzuzufügen. Zum Beispiel:
return render_to_response('test.html',{}, context_instance=RequestContext(request))
Was ist 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, wie django.contrib.sessions.middleware.SessionMiddleware oder django.contrib.auth.middleware.AuthenticationMiddleware eine Middleware-Klasse zu schreiben. Diese Klasse ändert die Anfrage Details, bevor sie zu einer Ansicht gesendet werden.
Wenn Sie es auf einer per-View-Basis benötigt, könnten Sie einen Dekorateur schreiben, das klein bisschen zu tun, und @decorator die Ansichten, die Sie wollen.