我正在使用django-filter
app,这个问题与此有关,但毕竟它几乎是python / django泛型。
关于应用程序正常工作方式的简要说明:过滤器接受lookup_type
参数。它们表现得像django形式,例如
filters.py
class ProductFilter(django_filters.FilterSet):
price = django_filters.NumberFilter(lookup_type='lt')
然后views.py
from .filters import ProductFilter
def product_list(request):
filtered_data = ProductFilter(request.GET, queryset=Product.objects.all())
return render(request, 'template.html', {'f': filtered_data})
这样可以正常但如果我希望网站访问者能够明确指定lookup_type
并根据他的选择进行过滤,该怎么办?我提出的一个解决方案是将filters.py
的所有代码转移到views.py
:
def product_list(request):
lookup_type_user = request.GET.get('lookup_type', 'exact')
class ProductFilter(django_filters.FilterSet):
price = django_filters.NumberFilter(lookup_type=lookup_type_user)
filtered_data = ProductFilter(request.GET, queryset=Product.objects.all())
# ...
这有效,但我想将代码保存在单独的文件中。你有什么想法吗?
答案 0 :(得分:1)
在过滤器模块中定义一个创建过滤器类的函数。
def filter_factory(lookup_type):
class ProductFilter(django_filters.FilterSet):
price = django_filters.NumberFilter(lookup_type=lookup_type)
return ProductFilter
然后在视图中导入filter_factory
。
from .filters import filter_factory
def product_list(request):
lookup_type_user = request.GET.get('lookup_type', 'exact')
ProductFilter = filter_factory(lookup_type_user)
filtered_data = ProductFilter(request.GET, queryset=Product.objects.all())
return render(request, 'template.html', {'f': filtered_data})