为什么要做模糊查询,如你的客户可能非常非常多,你自己一页页翻,虽然有分页但还得一页页找。所以应该给它来一个搜索框,输入一下点提交然后把满足条件的筛选出来。
1.customer_list.html中添加搜索框:你要请求还要带一部分数据所以用form表单,且我想让搜索条件显示到url地址栏中
效果如下:
2.做筛选:
(1)模糊查询法一:
views.py中(get请求方法中做就行,写在它的筛选条件中即可),那要用到Q对象(因为是或的关系,如我用qq=123或name=123做筛选)
from django.db.models import Q
class CustomerList(View):
def get(self, request):
query = request.GET.get('query','')#且设一个默认值空的字符串
if request.path_info == reverse('customer'): #公户
#把Q对象写到你筛选的条件里且或的关系所以加管道符
all_customer = models.Customer.objects.filter(Q(qq__contains=query) | Q(name__contains=query),consultant__isnull=True)
else: #私户
all_customer = models.Customer.objects.filter(Q(qq__contains=query) | Q(name__contains=query),consultant=request.user)
page = Pagination(request, all_customer.count())
return render(request, 'crm/customer_list.html',
{"all_customer": all_customer[page.start:page.end], 'pagination': page.show_li})
效果如下:
搜索框输入98即筛选QQ列或name列含98数字的客户如下出来结果了:
但是有上述效果有问题,就是我到时候不想查qq或name这两个列的了,就不方便改。
模糊查询法一:
all_customer = models.Customer.objects.filter(Q(qq__contains=query) | Q(name__contains=query),consultant__isnull=True)
模糊查询法二:不用等号,等号相当于传一关键字,而下法中相当于传两参数并包一个元组
all_customer = models.Customer.objects.filter(Q(('qq__contains',query)) | Q(('name__contains',query)),consultant__isnull=True)
(2)Q对象的另外一种写法---更灵活更方便,想筛选哪个字段都好加---建议用此法:
views.py中:
class CustomerList(View):
def get(self, request):
query = request.GET.get('query','')
q = Q()#让Q对象等于q
q.connector = 'OR'#这个OR就是或的意思,就是满足下面几个字段中一个即可,若改成AND就是且的意思即都得满足才行
q.children.append(Q(('qq__contains',query)))#你想筛选哪个字段直接如下加就行,你加的字段就是q的孩子
q.children.append(Q(('name__contains',query)))#筛选名字
q.children.append(Q(('last_consult_date__contains',query)))#筛选最后跟进日期
if request.path_info == reverse('customer'):#那你(公户私户)筛选条件中直接放q就行了
all_customer = models.Customer.objects.filter(q,consultant__isnull=True)
else:
all_customer = models.Customer.objects.filter(q,consultant=request.user)
page = Pagination(request, all_customer.count())
return render(request, 'crm/customer_list.html',
{"all_customer": all_customer[page.start:page.end], 'pagination': page.show_li})
(4)把Q对象上述好用的这个方法写成一个方法get_search_contion,那你以后调用此功能就很方便,也易修改了
views.py中:
# 展示客户列表CBV
class CustomerList(View):
def get(self, request):
q = self.get_search_contion(['qq','name'])#get方法调用get_search_contion方法,并给此它传一个列表(你要筛选的字段)
if request.path_info == reverse('customer'):
all_customer = models.Customer.objects.filter(q,consultant__isnull=True)
else:
all_customer = models.Customer.objects.filter(q,consultant=request.user)
page = Pagination(request, all_customer.count())
return render(request, 'crm/customer_list.html',
{"all_customer": all_customer[page.start:page.end], 'pagination': page.show_li})
def post(self, request): --省略-
def multi_apply(self): --省略-
def multi_pub(self): --省略-
def get_search_contion(self,query_list):#并传字段列表参数
query = self.request.GET.get('query', '')
q = Q()
q.connector = 'OR'
for i in query_list:#for循环字段列表并加字段加到Q对象里成它的孩子
q.children.append(Q(('{}__contains'.format(i), query)))#拼接
return q