2010-07-11 13 views
17

Tengo un dato común {el número de mensaje del usuario conectado) para mostrar en cada página. Puedo pasar simplemente a la plantilla comoCómo pasar datos comunes del diccionario a cada página en django

dict={'messagenumber':5} 
return render_to_response('template.html',dict,context_instance=RequestContext(request)) 

Pero parece tedioso si tengo este pase de datos dict a la misma página. ¿Hay alguna manera más fácil de pasar datos comunes a cada página?

Gracias

Respuesta

16

Me sorprende lo común que es esto. ¡Quieres usar context processors mi amigo!

muy fáciles de crear, de esta manera:

def messagenumber_processor(request): 
    return {'messagenumber': 5} 

Desde MessageNumber es una variable dinámica basada en el usuario, es posible extraer datos de la base de datos por ir a buscar a request.user y cuando usted tiene acceso completo a request dentro de cada procesador de contexto.

Luego, agréguelo a su TEMPLATE_CONTEXT_PROCESSORS dentro de settings.py y listo :-) También puede hacer cualquier forma de operación de base de datos u otra lógica dentro del procesador de contexto, ¡pruébelo!

+1

dos notas: 1) que necesitará tener django.contrib.auth.middleware.AuthenticationMiddleware en sus MIDDLEWARE_CLASSES de ajuste con el fin de request.user para trabajar. 2) Solo las plantillas renderizadas con instancias django.template.RequestContext como contexto tendrán procesadores de contexto aplicados. –

+0

gracias, un par de preguntas más. *) ¿Puedo poner este método en cualquier lugar (en cualquiera de mis archivos de vista)? *) Agregando este procesador como 'myproject.myapp.myview.messagenumber_processor'? y *) ¿Cómo llamar a estos datos en la plantilla? request.messagenumber_processor? – icn

+0

@Joseph Puntos válidos, que figuran en los enlaces que publiqué, ¡pero gracias! @xlione Usted técnicamente puede ponerlo aquí dentro de su proyecto, pero se recomienda colocarlo en un 'context_processors.py' para la aplicación que estos procesadores de contexto manejarán. Para llamar los datos en su plantilla, haga referencia al dict que devuelve en el procesador de contexto. Por ejemplo, en mi ejemplo si pongo '{{número_de_mensaje}}' en mi plantilla, se obtendría '5' suponiendo que conecté correctamente mi procesador de contexto. – Bartek

0

escribir su propia función para manejarlo.

def render_with_message_number(template, message_number, request): 
    return render_to_response(template, dict(messagenumber=message_number), 
     context_instance=RequestContext(request)) 

Y no sombrear dict.

17

Sólo para ahorrar tiempo de alguien si nuevo en Django

settings.py

TEMPLATE_CONTEXT_PROCESSORS = ("django.contrib.auth.context_processors.auth", 
"django.core.context_processors.debug", 
"django.core.context_processors.i18n", 
"django.core.context_processors.media", 
"django.core.context_processors.static", 
"django.contrib.messages.context_processors.messages", 
"home.context_processor.remote_ip") 

de inicio de la aplicación, crear un archivo llamado pitón context_processor.py

en el context_processor.py agregar una funcionar de esta manera:

def remote_ip(request): 
    return {'remote_ip': request.META['REMOTE_ADDR']} 

usarlo en las plantillas lik e {{}} remote_ip

+1

soy nuevo en django, tu explicación es muy útil, gracias – Prabu

Cuestiones relacionadas