Pregunta

Tengo un código que tiene la actual usuario conectado.

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

Quiero que el nombre de usuario aparezca en cada página.

En el momento que estoy poniendo el código en todas las vistas y pasar el objeto de usuario para cada plantilla

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

Esto parece ir en contra de la ética D.R.Y de Django. ¿Cómo puedo hacer esto con repetirme?

EDIT: Tal usuario era un mal ejemplo

.

Lo que si quería obtener una lista de objetos de la base de datos,

items = Item.objects.all()

y hacer una lista de everypage.

¿Tengo que escribir ese código y pasar a la lista de la plantilla en todas las vistas. O puedo escribir algo de código una vez que hará que esa lista a disposición de todas las plantillas?

¿Fue útil?

Solución

Debe utilizar un etiqueta de plantilla para algo como eso. Se puede recuperar los datos que necesita en la etiqueta personalizada, y enviarlo a la plantilla. Todo lo que necesitas recordar es para cargar la etiqueta en el archivo de plantilla que va a utilizarlo en.

Otros consejos

El ID de usuario ya existe dentro de la sesión. Como tal, no es necesario seguir pasando a su alrededor.

{{ request.session._auth_user_id }}

Eso debería funcionar, pero hay que añadir esto en sus TEMPLATE_CONTEXT_PROCESSORS en el archivo de configuración:

django.core.context_processors.request

En su render_to_response, que había necesidad de añadir el pedido como parámetro. Por ejemplo:

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

¿Qué hay de request.user?

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

De todos modos, si no estaba ya disponible en Django, me gustaría sugerir que escribir una clase middleware igual o django.contrib.sessions.middleware.SessionMiddleware django.contrib.auth.middleware.AuthenticationMiddleware. Esa clase altera los detalles de la solicitud antes de ser enviados a una vista.

Si lo necesitas en una base per-view, se podría escribir un decorador de hacerlo poco pequeño, y @decorator las vistas que desea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top