2012-08-29 32 views
29

Estoy construyendo una libreta de direcciones que incluye las relaciones entre entradas, etc. Tengo modelos separados para particulares, empresas, salas, y roles. En mi página de índice me gustaría enumerar todas las instancias de cada modelo y luego filtrarlas. Para que una persona pueda buscar y encontrar fácilmente una entrada. He sido capaz de enumerar un solo modelo con vistas genéricas y utilizar get_extra_context para mostrar un modelo más:Django pasar múltiples modelos para una plantilla

#views.py 

class IndividualListView(ListView): 

    context_object_name = "individual_list" 
    queryset = Individual.objects.all() 
    template_name='contacts/individuals/individual_list.html' 


class IndividualDetailView(DetailView): 

    context_object_name = 'individual_detail' 
    queryset = Individual.objects.all() 
    template_name='contacts/individuals/individual_details.html' 

    def get_context_data(self, **kwargs): 
     context = super(IndividualDetailView, self).get_context_data(**kwargs) 
     context['role'] = Role.objects.all() 
     return context 

También soy capaz de enumerar un único modelo usando una vista personalizada:

#views.py 
def object_list(request, model): 
    obj_list = model.objects.all() 
    template_name = 'contacts/index.html' 
    return render_to_response(template_name, {'object_list': obj_list}) 

Aquí son los urls.py para estas dos pruebas: "¿Cómo puedo modificar esto para pasar más de un modelo para la plantilla"

(r'^$', views.object_list, {'model' : models.Individual}), 

(r'^individuals/$', 
    IndividualListView.as_view(), 
     ), 
(r'^individuals/(?P<pk>\d+)/$', 
    IndividualDetailView.as_view(), 

     ), 

Así que mi pregunta es ¿Es posible? Todas las preguntas similares en StackOverflow solo se refieren a dos modelos (que se pueden resolver usando get_extra_context).

Respuesta

11

Sugiero se quita la vista object_list,

definen un diccionario para este punto de vista específico,

all_models_dict = { 
     "template_name": "contacts/index.html", 
     "queryset": Individual.objects.all(), 
     "extra_context" : {"role_list" : Role.objects.all(), 
          "venue_list": Venue.objects.all(), 
          #and so on for all the desired models... 
          } 
    } 

y luego en sus URL:

#add this import to the top 
from django.views.generic import list_detail 

(r'^$', list_detail.object_list, all_models_dict), 
+0

Gracias! Esto es exactamente lo que necesitaba. –

+1

+1 fue sorprendentemente difícil encontrar esta información. ¡Gracias! –

+1

Ojalá hubiera alguna explicación real. – kevr

45

acabé modificando @thikonom 's respuesta a utilizar puntos de vista basados ​​en la clase:

class IndexView(ListView): 
    context_object_name = 'home_list'  
    template_name = 'contacts/index.html' 
    queryset = Individual.objects.all() 

    def get_context_data(self, **kwargs): 
     context = super(IndexView, self).get_context_data(**kwargs) 
     context['roles'] = Role.objects.all() 
     context['venue_list'] = Venue.objects.all() 
     context['festival_list'] = Festival.objects.all() 
     # And so on for more models 
     return context 

y en mi urls.py

url(r'^$', 
    IndexView.as_view(), 
    name="home_list" 
     ), 
+8

hi @Nahanaeli ¿Puedo preguntar qué buscará la plantilla como cuando tienes dos modelos? – noobes

+0

Gran respuesta. ¿Puedo preguntar, qué pasa si necesita obtener información pasada por el analizador de URL al mismo tiempo? Digamos que estábamos tomando la clave principal del individuo (como en la pregunta), y necesitábamos usar esto para filtrar la lista del lugar. No estoy seguro de cómo el método get_context_data podría recibir ese identificador. – AlanSE

+0

¡Gran respuesta, exactamente lo que estaba buscando ... +1! –

5

Si usted quiere construir en Django 1.5 usted será capaz de utilizar la versión estable de los VBC. Por favor encuentre el código a continuación.

Gran doc se puede encontrar aquí https://docs.djangoproject.com/en/dev/topics/class-based-views/mixins/

class ProductsCategoryList(ListView): 
    context_object_name = 'products_list' 
    template_name = 'gallery/index_newborn.html' 

    def get_queryset(self): 
     self.category = get_object_or_404(Category, name=self.args[0]) 
     return Products.objects.filter(category=self.category) 

    def get_context_data(self, **kwargs): 
     kwargs['category'] = Category.objects.all() 
     # And so on for more models 
     return super(ProductsCategoryList, self).get_context_data(**kwargs) 
+0

¿Qué pasa con mi respuesta? – grillazz

+0

Creo que es simplemente una exageración – Rexford

+2

Lo sentimos, pero no puedo ver nada overkilling ella;) – grillazz

Cuestiones relacionadas