Django Pass Múltiples Modelos a una Plantilla

Estoy construyendo una libreta de direcciones que incluye las relaciones entre las entradas, etc. Tengo modelos separados para Individuos, Empresas, Sedes 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 podido enumerar un único modelo utilizando vistas genéricas y uso get_extra_context para mostrar un modelo más:

#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 puedo enumerar un solo 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í están los urls.py para estas dos pruebas:

 (r'^$', views.object_list, {'model' : models.Individual}), (r'^individuals/$', IndividualListView.as_view(), ), (r'^individuals/(?P\d+)/$', IndividualDetailView.as_view(), ), 

Entonces mi pregunta es “¿Cómo modifico esto para pasar más de un modelo a la plantilla?” ¿Es posible? Todas las preguntas similares en StackOverflow solo se refieren a dos modelos (que se pueden resolver usando get_extra_context).

Te sugiero que elimines tu vista de la lista de object_list ,

definir un diccionario para esta vista específica,

  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 tus urls:

 #add this import to the top from django.views.generic import list_detail (r'^$', list_detail.object_list, all_models_dict), 

Terminé modificando la respuesta de @thikonom para usar vistas basadas en clases:

 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" ), 

Si desea comstackrlo en Django 1.5, podrá utilizar versiones estables de CBV. Por favor encuentre el código a continuación.

Gran documento que puedes 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)