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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top