我正在使用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())
# ...
这可行,但我想将代码保存在单独的文件中。你有什么想法吗?
最佳答案
在过滤器模块中定义一个函数来创建过滤器类。
def filter_factory(lookup_type):
class ProductFilter(django_filters.FilterSet):
price = django_filters.NumberFilter(lookup_type=lookup_type)
return ProductFilter
然后在您的 View 中导入 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})
关于python - 从views.py中取出不相关的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20044972/