我正在尝试构建数据过滤分页页面。这是我的过滤器
from shop.models import CC
import django_filters
name_values = [("", "---------")] + list(CC.objects.values_list('name', 'name').distinct())
city_values = [("", "---------")] + list(CC.objects.values_list('city', 'city').distinct())
class CCFilter(django_filters.FilterSet):
name = django_filters.ChoiceFilter(choices=name_values)
city = django_filters.ChoiceFilter(choices=city_values)
class Meta:
model = CC
fields = {
'name': ['exact'],
'city': ['exact'],
}
查看:
@method_decorator(login_required, name='dispatch')
class BuyView(ListView):
paginate_by = '25'
queryset = CC.objects.all()
context_object_name = "ccs"
template_name = "buy.html"
def get_queryset(self):
queryset = super(BuyView, self).get_queryset()
queryset = CCFilter(self.request.GET, queryset)
return queryset
def get_context_data(self, **kwargs):
context = super(BuyView, self).get_context_data(**kwargs)
context['cart'] = Cart.objects.get(user=self.request.user)
return context
def get_paginate_by(self, queryset):
"""
Paginate by specified value in querystring, or use default class property value.
"""
return self.request.GET.get('per_page', self.paginate_by)
型号:
class CC(models.Model):
number = models.CharField(max_length=19, unique=True)
name = models.CharField(max_length=70)
在 documentation据记载,表单对象可用作模板中的上下文属性。但是当我执行 {{ ccs.form|crispy }}
时,什么也没有出现。虽然我可以使用像 ?name=christian
这样的 get 请求来过滤数据,但它效果很好。但我如何访问表单?
最佳答案
文档显示您可以编写 View 并将过滤器手动传递给模板,或者使用内置的FilterView
。您当前正在使用 Django 的 ListView
,因此除非您显式执行,否则过滤器不会传递到模板。
您可以尝试更改 View 以使用 FilterView
代替。它看起来像这样。为了简单起见,我省略了分页代码。
from django_filters.views import FilterView
@method_decorator(login_required, name='dispatch')
class BuyView(FilterView):
filterset_class = CCFilter
template_name = "buy.html"
context_object_name = "ccs"
def get_queryset(self):
queryset = super(BuyView, self).get_queryset()
queryset = CCFilter(self.request.GET, queryset)
return queryset
def get_context_data(self, **kwargs):
context = super(BuyView, self).get_context_data(**kwargs)
context['cart'] = Cart.objects.get(user=self.request.user)
return context
在模板中,您可以使用 {{ filter }}
访问过滤器,使用 {{ filter.form }}
访问表单
关于python - 表单在 django_filters 模板中不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37215551/