bootstrap - Django Pass MĂșltiples Modelos a una Plantilla
django templates bootstrap (3)
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<pk>/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).
Si desea compilarlo 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)
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"
),