【发布时间】:2021-04-02 12:34:39
【问题描述】:
如果没有过滤项目,我在我的项目中应用了 django-filter 库。 如果我访问 url http://127.0.0.1:8000/products/?q=&category=electronics 它应该提供唯一的电子产品,但它提供所有可用的产品。我做错了什么?它应该过滤类别明智或产品标题明智和价格明智。
class ProductFilter(FilterSet): # by using django-filters
title = CharFilter(field_name='title', lookup_expr='icontains', distinct=True)
category = CharFilter(field_name='categories__title', lookup_expr='icontains', distinct=True)
category_id = CharFilter(field_name='categories__id', lookup_expr='icontains', distinct=True)
min_price = NumberFilter(field_name='price', lookup_expr='gte', distinct=True)
max_price = NumberFilter(field_name='price', lookup_expr='lte', distinct=True)
class Meta:
model = Product
fields = ['category', 'title', 'description', 'min_price', 'max_price']
class FilterMixin(object):
filter_class = ProductFilter
search_ordering_param = 'ordering'
def get_queryset(self, *args, **kwargs):
try:
qs = super(FilterMixin, self).get_queryset(*args, **kwargs)
return qs
except:
raise ImproperlyConfigured("You must have a queryset in order to use the FilterMixin")
def get_context_data(self, *args, **kwargs):
context = super(FilterMixin, self).get_context_data(*args, **kwargs)
qs = self.get_queryset()
ordering = self.request.GET.get(self.search_ordering_param)
if ordering:
qs = qs.order_by(ordering)
filter_class = self.filter_class
print(filter_class)
if filter_class:
f = filter_class(self.request.GET, queryset=qs)
context['object_list'] = f
return context
class ProductListView(FilterMixin, ListView):
queryset = Product.objects.all()
filter_class = ProductFilter
def get_context_data(self, *args, **kwargs):
context = super(ProductListView, self).get_context_data(*args, **kwargs)
context['filter_form'] = ProductFilterForm(data=self.request.GET or None)
return context
模板文件-
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% load static %}
{% block content %}
<div class='col-sm-2'>
<form method="GET" action="{% url 'products:product-list' %}">
{{ filter_form|crispy }}
<input type='hidden' name='q' value='{{ request.GET.q }}' />
<input type='submit' value='Apply Filter' class='btn btn-default'>
</form>
<a href="{% url 'products:product-list' %}">Clear Filters</a>
</div>
<div class='col-sm-12'>
<h3>All Products <small>*<a href="{% url 'categories:category-list'%}">Categories</a>*</small></h3>
{% if product_list %}
<div class="row">
{% for product in product_list %}
<div class="col">
{% include 'products/snippets/card.html' with instance=product %}
</div>
{% endfor %}
{% else %}
<p>No product found!!</p>
{% endif %}
</div>
</div>
{% endblock %}
【问题讨论】:
-
共享您呈现项目的模板。
-
@WillemVanOnsem 看看。
-
你的
FilterMixin永远不会导出像product_list这样的东西,所以这将是原始查询集。 -
@WillemVanOnsem
FilterMixincontaxt 变量object_list给出类似<products.views.ProductFilter object at 0x05DB4A90> -
是的,但这对
product_list没有影响...此外,即使这是真的,这不是您使用过滤器集进行过滤的方式,您需要访问过滤器集的.qs。
标签: python-3.x django django-rest-framework django-views django-filter