首先来语段很官方的介绍:
Django-filter是一个通用的、可重用的应用程序来缓解写一些平凡的视图代码。具体地说,它允许用户过滤queryset基于模型
的字段,从而显示对应的过滤结果。因此在使用django-filter 的时候能节省很多查询的后台代码。
版本支持:
首先从安装说起,还是用常用的python包管理工具pip,当然用pipenv也是可以的。
$ pip install django-filter
安装后添加该模块到对应的setting文件中的
INSTALLED_APPS里面:
INSTALLED_APPS = [
...
'django_filters',
]
from django.db import models
class Product(models.Model):
username = models.CharField(max_length=255)
firstname = models.CharField(max_length=255)
lastname = models.CharField(max_length=255)
status = models.CharField()
description = models.TextField()
release_date = models.DateField()
manufacturer = models.ForeignKey(Manufacturer)
再看filter层:
import django_filters
class ProductFilter(django_filters.FilterSet):
# 此处STATUS_ENUM为前段select显示的下拉框的内容格式为((“a”,“b”),("c","d"))
# ChoiceFilter,CharFilter 等方式根据需要使用
first = django_filters.ChoiceFilter(choices=STATUS_ENUM ))
class Meta: model = Product fields = ['username', 'lastname','firstname']
最后看对应的view层:
def query_saleorder(request):
# 查询出所有的结果(从这些结果里面根据条件筛选)
filter = ProductFilter(request.GET, queryset=Product.objects.all())
return render(request, 'ofc/list.html', {'filter': filter})
对应前端(html)层:
{{ filter.form.as_p }}
{% csrf_token %}
{% for foo in filter.qs %}
{{ foo.status }}
{{ foo.manufacturer }}
{% endfor %}
这时候就大功告成了,你基本上可以看到如下页面:
可能还有人有疑问:生成的样式这么丑,根本拿不出手啊,熟话说,代码是死的,人是活的;
下面提供几种方式解决样式的的问题:
1、使用bootStrap和django-filter 结合:
在django-filter里面提供了一种工具,可以让生成出来的控件默认使用bootstrap的样式,那么就需要安装django-crispy-forms了,安装代码如下:
pip install django-crispy-forms
2、你可以在写filter的时候加上widget参数,能够自定义class方法,也能给他制定id,name深圳style等属性
status = django_filters.ChoiceFilter(choices=STATUS_ENUM,
widget=forms.Select(attrs={'class': 'select',
'name': 'status',
'data-width': '100%'}))
3、有了前两种方式,基本上可以满足大部分人对django-filter的使用要求,当然,如果更有甚者,
觉得光添加个class根本不够,还想自定义布局,或者有些人不想把一些前端的class,id等属性
放在后台view里面,这可怎么办呢,是不是准备放弃了了?别,车道山前必有路,我们还有
widget_tweaks,这个插件就能满足
你的大多数要求,你只需要先安装
pip install django-widget-tweaks
然后在对应的配置文件(setting)中引用:
INSTALLED_APPS = [
...
'django-widget-tweaks',
]
最后你就可以愉快的编(zhuang)码(bi)了,前端页面部分代码如下:
{{ filter.form.username.label_tag }}
{% render_field filter.form.username class="form-control" %}
{{ filter.form.first_name.label_tag }}
{% render_field filter.form.first_name class="form-control" %}
{{ filter.form.last_name.label_tag }}
{% render_field filter.form.last_name class="form-control" %}
最终效果会出乎意料的美(sui)观(yi):
参考文献:
https://pypi.python.org/pypi/django-widget-tweaks
https://django-filter.readthedocs.io/en/master/ref/fields.html