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

标签 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())
    # ...

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

最佳答案

在过滤器模块中定义一个函数来创建过滤器类。

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/

相关文章:

python - scipy.sparse 矩阵的 bool 运算

django - 潜在的 docker 权限问题导致枕头说它没有安装,尽管它是

django - 使用 django 过滤器,如何使用 OR 对多个字段进行查找?

python - 如何在 django 过滤器中使用选择字段值过滤对象

python - 无法使用 Python 在 Ubuntu 上运行 Selenium

python - python 中的模拟 Bottle.request 对象

Django:模板 Assets 的静态文件夹

django - 如何在 django_filter 中使用分页

python - 如何在 Python 3 中的输入后添加字符串?

python - 在 Django 模板中减去 2 个整数