Mantenere Django Visto SECCO
-
11-09-2019 - |
Domanda
Ho qualche codice che ottiene l'attuale utente collegato.
userID = request.session.get("_auth_user_id")
if userID:
loggedin_user = User.objects.get(pk=int(userID))
else:
loggedin_user = None
Voglio il nome utente di presentarsi in ogni pagina.
Al momento mi sto mettendo il codice in ogni vista e passando l'oggetto utente per ogni template
return render_to_response('index.html', {loggedin_user})
Questo sembra andare contro D.R.Y etica di Django. Come posso fare questo con ripetermi?
EDIT: Forse l'utente è stato un cattivo esempio
.Che cosa succede se volevo ottenere un elenco di oggetti dal database,
items = Item.objects.all()
e li elenco in everypage.
Devo scrivere che il codice e passare l'elenco per il modello in ogni vista. O posso scrivere del codice, una volta che farà tale elenco a disposizione di tutti i modelli?
Soluzione
È necessario utilizzare un personalizzato tag modello qualcosa del genere. È possibile recuperare i dati necessari nel tag personalizzato, e inviarlo al modello. Tutto quello che dovete ricordare è quello di caricare il tag nel file di modello che si vuole utilizzare in.
Altri suggerimenti
L'ID utente esiste già all'interno della sessione. In quanto tale, non è necessario per mantenere passarlo intorno.
{{ request.session._auth_user_id }}
Che dovrebbe funzionare, ma è necessario aggiungere questo nelle vostre TEMPLATE_CONTEXT_PROCESSORS nel file delle impostazioni:
django.core.context_processors.request
Nel vostro render_to_response, avresti bisogno di aggiungere la richiesta come parametro. Ad esempio:
return render_to_response('test.html',{}, context_instance=RequestContext(request))
Che dire request.user?
if request.user.is_authenticated():
name = request.user.username
else:
name = "Anonymous"
In ogni caso, se non fosse già disponibile in Django, io suggerirei di scrivere una classe Middleware come django.contrib.sessions.middleware.SessionMiddleware o django.contrib.auth.middleware.AuthenticationMiddleware. Quella classe altera i dettagli della richiesta prima che vengano inviati a una vista.
Se avete bisogno su base per-view, si potrebbe scrivere un decoratore di fare quel piccolo po ', e @decorator il punto di vista che si desidera.