当前位置: 首页 > 工具软件 > date-filter > 使用案例 >

django-filter的从入门到精通

马坚
2023-12-01

首先来语段很官方的介绍:

Django-filter是一个通用的、可重用的应用程序来缓解写一些平凡的视图代码。具体地说,它允许用户过滤queryset基于模型

的字段,从而显示对应的过滤结果。因此在使用django-filter 的时候能节省很多查询的后台代码。

版本支持:

  • Python: 3.4, 3.5, 3.6
  • Django: 1.11, 2.0b
  • DRF: 3.7

首先从安装说起,还是用常用的python包管理工具pip,当然用pipenv也是可以的。

$ pip install django-filter
安装后添加该模块到对应的setting文件中的 INSTALLED_APPS里面
INSTALLED_APPS = [
    ...
    'django_filters',
]
接下来就到了对应的model,filter和view层的层次结构了
首先看model层:
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)层:
  • 这是对应的form表单显示内容
{{ filter.form.as_p }}   
  • 以下是对应的表格显示内容
{% csrf_token %}
{% for foo in filter.qs %}
    <tr>
        <td>{{ foo.status }}</td>
        <td>{{ foo.manufacturer }}</td>
      
    </tr>
{% 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)了,前端页面部分代码如下:
 
 
<div class="form-group col-sm-4 col-md-3">     
         {{ filter.form.username.label_tag }}          
	{% render_field filter.form.username class="form-control" %}        
</div>        
<div class="form-group col-sm-4 col-md-3">          
	{{ filter.form.first_name.label_tag }}          
	{% render_field filter.form.first_name class="form-control" %}        
</div>        
<div class="form-group col-sm-4 col-md-3">          
	{{ filter.form.last_name.label_tag }}          
	{% render_field filter.form.last_name class="form-control" %}        
</div>
最终效果会出乎意料的美(sui)观(yi):
参考文献:
https://pypi.python.org/pypi/django-widget-tweaks
https://django-filter.readthedocs.io/en/master/ref/fields.html
 
 
 
 





 类似资料: