我想在模板index.html
中显示以下两个视图。
class IndexView(generic.ListView):
template_name = 'items/index.html'
context_object_name = 'popular_items_list'
def get_queryset(self):
return Item.objects.order_by('-rating')[:5]
class tryView(generic.ListView):
template_name = 'items/index.html'
context_object_name = 'latest_items_list'
def get_queryset(self):
return Item.objects.order_by('pub_date')[:5]
有没有办法将这两个视图合并到一个视图中?
如何在index.html
上显示两个查询集?
是否可以在模板中发送所有Item.objects.all()
和过滤器?
答案 0 :(得分:5)
这里有几个问题,让我回答第一个问题。
您可以覆盖get_context_data
并在一个视图中添加模板的上下文以获取更多项目。例如......
class IndexView(generic.ListView):
template_name = 'items/index.html'
context_object_name = 'popular_items_list'
def get_queryset(self):
return Item.objects.order_by('-rating')[:5]
def get_context_data(self, *args, **kwargs):
context = super(IndexView, self).get_context_data(*args, **kwargs)
context['moreItems'] = Item.objects.order_by('pub_date')[:5]
return context
这样,您可以根据需要在页面/模板上包含多个查询集。在此示例中,您的模板中将提供moreItems
以及popular_items_list
关于第二个问题,是的,您可以传入URL参数并使用它们来过滤查询集。我建议阅读这篇文章。
答案 1 :(得分:-1)
我可以想到两种选择。一个选项是视图中的get_context_data,其外观如下:
#views.py
class IndexView(generic.ListView):
template_name = 'items/index.html'
def get_context_data(self, **kwargs):
context = super(IndexView, self).get_context_data(**kwargs)
context['item_by_rating'] = Item.objects.order_by('-rating')[:5]
context['item_by_pub_date'] = Item.objects.order_by('pub_date')[:5]
return context
然后在您的模板中,您可以访问{{items_by_rating}}和{{items_by_pub_date}}
第二个选项是对模板中的对象进行排序,这样您就可以在视图中定义一个上下文变量,然后使用the dictsort template filter在模板中以不同的方式进行排序。这看起来像这样:
# views.py
class tryView(generic.ListView):
template_name = 'items/index.html'
def get_queryset(self):
return Item.objects.all()
# index.html
{% for i in object_list|dictsort:"item.pub_date" %}
{{ i.rating }} {{ i.pub_date }}
{% endfor %}
我想我更喜欢第二个选项,只是传递一个object_list上下文项,然后在模板中进行排序。但无论哪种方式都应该没问题。