Django передает несколько моделей в один шаблон
Я создаю адресную книгу, которая включает отношения между записями и т.д. У меня есть отдельные модели для отдельных лиц, компаний, мест и ролей. На моей индексной странице я хотел бы перечислить все экземпляры каждой модели и затем отфильтровать их. Чтобы человек мог легко найти и найти запись. Я смог перечислить одну модель с использованием общих представлений и использовать get_extra_context, чтобы показать еще одну модель:
#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
Я также могу перечислить одну модель с помощью пользовательского представления:
#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})
Ниже приведены urls.py для обоих этих тестов:
(r'^$', views.object_list, {'model' : models.Individual}),
(r'^individuals/$',
IndividualListView.as_view(),
),
(r'^individuals/(?P<pk>\d+)/$',
IndividualDetailView.as_view(),
),
Итак, мой вопрос: "Как мне изменить это, чтобы передать более одной модели шаблону?" Возможно ли это? Все подобные вопросы в StackOverflow задают только две модели (которые можно решить с помощью get_extra_context).
Ответы
Ответ 1
Я предлагаю вам удалить ваш object_list
вид,
определить словарь для этого конкретного вида,
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...
}
}
а затем в ваших URL:
#add this import to the top
from django.views.generic import list_detail
(r'^$', list_detail.object_list, all_models_dict),
Ответ 2
Я закончил модификацию ответа @thikonom для использования представлений на основе классов:
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
и в моем urls.py
url(r'^$',
IndexView.as_view(),
name="home_list"
),
Ответ 3
Если вы хотите построить его на Django 1.5, вы сможете использовать стабильную версию CBV. Пожалуйста, найдите код ниже.
Отличный документ вы можете найти здесь 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)
Ответ 4
Пожалуйста, помогите, у меня есть похожая проблема. и я хочу перейти с моделей Carrier и Members из приложения перевозчиков в carrier.html. Я пробовал решения выше, но это не работает в моем случае
Это модели Carrier у перевозчиков
![This is Carrier models in carriers[][1]]()