Django模板过滤器查询集

时间:2017-03-30 02:20:54

标签: python django django-templates django-queryset

我是django的新人。 我有一个django应用程序,其中存储按' X'分类的产品。和' Y'。

views.py

...

class CartListView(ListView):

template_name = 'checkout/list.html'
context_object_name = 'product_list'

def get_queryset(self):
    return Product.objects.filter(category__slug='X') | Product.objects.filter(category__slug='Y')

def get_context_data(self, **kwargs):
    context = super(CartListView, self).get_context_data(**kwargs)
    context['minicurso'] = get_object_or_404(Category, slug='X')
    context['pacotes'] = get_object_or_404(Category, slug='Y')
    return context
...

在我的views.py中,我按类别slug过滤了这些产品。

问题是,我试图将产品分类为X' X'在页面顶部和类别中的产品' Y'他们之间有文字。我怎么能这样做?

list.html

{% for category in product_list %}
    {{ category.name }}
{% endfor %}

<p> 
    Any text 
</p>

{% for category in product_list %}
    {{ category.name }}
{% endfor %}

1 个答案:

答案 0 :(得分:2)

首先,在填充已过滤的查询集时,您应该使用IN运算符而不是|

def get_queryset(self):
    return Product.objects.filter(category__slug__in=["X", "Y"])

其次,您不能按模板中的任何字段过滤查询集,除非您编写a custom template tag这样做。但是,它违背了将表示代码与数据逻辑分离的目的。过滤模型是数据逻辑,输出HTML是表示。因此,您需要覆盖get_context_data并将每个查询集传递到上下文中:

def get_context_data(self, **kwargs):
    context = super(CartListView, self).get_context_data(**kwargs)

    context['minicurso'] = get_object_or_404(Category, slug='X')
    context['pacotes'] = get_object_or_404(Category, slug='Y')

    context["x_product_list"] = self.get_queryset().filter(category=context['minicurso'])
    context["y_product_list"] = self.get_queryset().filter(category=context['pacotes'])

    return context

然后你可以在模板中使用它们:

{% for category in x_product_list %}
  {{ category.name }}
{% endfor %}

...

{% for category in y_product_list %}
  {{ category.name }}
{% endfor %}