六.6--客户展示之模糊查询

为什么要做模糊查询,如你的客户可能非常非常多,你自己一页页翻,虽然有分页但还得一页页找。所以应该给它来一个搜索框,输入一下点提交然后把满足条件的筛选出来。

1.customer_list.html中添加搜索框:你要请求还要带一部分数据所以用form表单,且我想让搜索条件显示到url地址栏中

 






效果如下:

六.6--客户展示之模糊查询_第1张图片

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数字的客户如下出来结果了:

六.6--客户展示之模糊查询_第2张图片

 

 

 

但是有上述效果有问题,就是我到时候不想查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

你可能感兴趣的:(六.6--客户展示之模糊查询)