如何给FilterView添加分页
How to add pagination to FilterView
我过滤了从 urls.py
调用的 django_filters.FilterSet 的视图
url(r'^$', FilterView.as_view(filterset_class=ProductFilter, template_name='products/products.html'), name='products'),
它没有分页,但是当我在
中添加 paginate_by = 20
url(r'^$', FilterView.as_view(filterset_class=ProductFilter, template_name='products/products.html'), paginate_by = 20, name='products'),
它添加了我的自定义分页页面,但它不处理受过滤器限制的数据。所以我可以应用一些过滤器并将数据减少到 40 行,但是单击第二页它会在没有任何过滤器的情况下加载我的所有数据。我可以指定我想以某种方式过滤后对数据进行分页吗?
最后我决定创建单独的视图并将查询集直接添加到上下文对象,如:
class ProductView(ListView):
model = Product
template_name = 'products/products.html'
paginate_by = 5
def get_context_data(self, **kwargs):
context = super().get_context_data()
context['product_list'] = ProductFilter(self.request.GET, queryset=Product.objects.order_by('id')).qs
return context
我发现在给定视图上使用过滤器实现分页要简单得多:
class ProductView(ListView):
model = Product
template_name = 'products/products.html'
paginate_by = 5
context_object_name = 'products'
def get_queryset(self):
return Product.objects.filter(my_field=my_criteria)
我过滤了从 urls.py
url(r'^$', FilterView.as_view(filterset_class=ProductFilter, template_name='products/products.html'), name='products'),
它没有分页,但是当我在
中添加paginate_by = 20
url(r'^$', FilterView.as_view(filterset_class=ProductFilter, template_name='products/products.html'), paginate_by = 20, name='products'),
它添加了我的自定义分页页面,但它不处理受过滤器限制的数据。所以我可以应用一些过滤器并将数据减少到 40 行,但是单击第二页它会在没有任何过滤器的情况下加载我的所有数据。我可以指定我想以某种方式过滤后对数据进行分页吗?
最后我决定创建单独的视图并将查询集直接添加到上下文对象,如:
class ProductView(ListView):
model = Product
template_name = 'products/products.html'
paginate_by = 5
def get_context_data(self, **kwargs):
context = super().get_context_data()
context['product_list'] = ProductFilter(self.request.GET, queryset=Product.objects.order_by('id')).qs
return context
我发现在给定视图上使用过滤器实现分页要简单得多:
class ProductView(ListView):
model = Product
template_name = 'products/products.html'
paginate_by = 5
context_object_name = 'products'
def get_queryset(self):
return Product.objects.filter(my_field=my_criteria)