Django 将多个模型传递给一个模板
Posted
技术标签:
【中文标题】Django 将多个模型传递给一个模板【英文标题】:Django Pass Multiple Models to one Template 【发布时间】:2012-08-24 15:25:38 【问题描述】:我正在构建一个地址簿,其中包含条目之间的关系等。我为个人、公司、地点和角色设置了单独的模型。在我的索引页面上,我想列出每个模型的所有实例,然后过滤它们。这样人们就可以轻松搜索并找到条目。我已经能够使用通用视图列出一个模型并使用 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(),
),
所以我的问题是“如何修改它以将多个模型传递给模板?”甚至可能吗? *** 上的所有类似问题只询问两个模型(可以使用 get_extra_context 解决)。
【问题讨论】:
【参考方案1】:我最终修改了@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"
),
【讨论】:
嗨@Nahanaeli 我能问一下当你有两个模型时模板会是什么样子吗? 很好的答案。请问,如果你需要同时获取url解析器传递的信息怎么办?假设我们正在获取个人的主键(如问题中所示),我们需要使用它来过滤场地列表。我不确定 get_context_data 方法如何接收该标识符。 很好的答案,正是我想要的……+1! @noobes 它看起来就像 key[value] 字典的值,所以只需通过for role in roles
或 for venue in venue_list
访问它
@chrisFrisina 这在模板中看起来如何?在这种情况下,我的模板似乎显示了所有的场地列表,而不仅仅是与所选个人相关联的场地列表(即我的页面是从个人的 pk 加载的,我只想显示这个人被分配到的场地)【参考方案2】:
我建议你删除你的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...
然后在您的网址中:
#add this import to the top
from django.views.generic import list_detail
(r'^$', list_detail.object_list, all_models_dict),
【讨论】:
谢谢!这正是我所需要的。 +1 很难找到这些信息。谢谢! 我希望有一些实际的解释。【参考方案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)
【讨论】:
我认为它只是矫枉过正 对不起,但我看不出有什么过分的;)以上是关于Django 将多个模型传递给一个模板的主要内容,如果未能解决你的问题,请参考以下文章