从views.py中取出不相关的代码

时间:2013-11-18 10:03:33

标签: python django django-filter

我正在使用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())
    # ...

这有效,但我想将代码保存在单独的文件中。你有什么想法吗?

1 个答案:

答案 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})