2009-04-24 9 views
6

que tiene un sitio web Django de la siguiente manera:MVT básico en Django

  • sitio tiene varios puntos de vista
  • cada vista tiene su propia plantilla para mostrar sus datos
  • cada plantilla se extiende una plantilla base
  • plantilla base es la base del sitio, tiene todos los JS/CSS y el diseño básico

Así que hasta ahora todo está bien. Entonces ahora tenemos el jefe principal del sitio (que existe en la plantilla base) y es común a todas las vistas.

Pero ahora quiero hacerlo más dinámico y agregarle algunos datos dinámicos. ¿En qué punto de vista hago esto? Todos mis puntos de vista son básicamente render_to_response('viewtemplate.html', someContext). Entonces, ¿cómo agregar una vista común a una plantilla base?

Obviamente, yo no duplicará el código común a cada vista separada ...

Creo que me falta algo fundamental en la base MVT de Django.

Respuesta

7

Quiere usar context_instance y RequestContext s.

En primer lugar, añadir en la parte superior de su views.py:

from django.template import RequestContext 

A continuación, actualizar todos los puntos de vista para que parezca:

def someview(request, ...) 
    ... 
    return render_to_response('viewtemplate.html', someContext, context_instance=RequestContext(request)) 

En su settings.py, añadir:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.auth', 
    ... 
    'myproj.app.context_processors.dynamic', 
    'myproj.app.context_processors.sidebar', 
    'myproj.app.context_processors.etc', 
) 

Cada uno de estos context_processors es una función toma el request objeto y devuelve un contexto en forma de diccionario. Simplemente ponga todas las funciones en context_processors.py dentro de la aplicación apropiada. Por ejemplo, un blog puede tener una barra lateral con una lista de entradas y comentarios recientes. context_processors.py sería simplemente definir:

def sidebar(request): 
    recent_entry_list = Entry.objects... 
    recent_comment_list = Comment.objects... 
    return {'recent_entry_list': recent_entry_list, 'recent_comment_list': recent_comment_list} 

Se pueden añadir tantos o tan pocos como desee.

Para obtener más información, consulte Django Template Docs.

+2

maravilloso! ¡Gracias! corrigió un pequeño error en la importación ... –

+1

Simplemente no te excedas con los procesadores de contexto: solo los datos que realmente se usan en cada carga de página única pertenecen a un procesador de contexto, de lo contrario, estás desperdiciando consultas de DB. –

-1

o utilice un generic view, porque se pasan automáticamente el contexto de solicitud.

se puede utilizar una vista genérica directa a la plantilla simple para evitar tener que importar/pasar en el contexto de la solicitud.

2

Los procesadores de contexto y RequestContext (consulte la respuesta de Tyler) son el camino a seguir para los datos que se utilizan en cada carga de página. Para los datos que puede necesitar en varias vistas, pero no en todas (especialmente datos que no están realmente relacionados con el propósito principal de la vista, pero aparecen en algo así como una barra lateral de navegación), a menudo tiene más sentido definir una plantilla personalizada etiqueta para recuperar los datos.