1. 展示公户和私户
1. 公户和私户的区别
1. 没有招生的老师的客户就是公户
else: # 1. 获取所有的公户信息 query_set = Customer.objects.filter(consultant__isnull=True) # 单表查询神奇的双下划线
2. 有招生老师的客户就是私户
if request.path_info == reverse('my_customer'): # 2. 获取私户信息 query_set = Customer.objects.filter(consultant=request.user)
2. request.user
1. auth中间件做的事儿(详见群内截图)
2. 公户 <--> 私户
1. form表单就像一个盆,把用户需要提交的数据包起来
2. 通过 action 反射执行相应的私有方法
def _to_private(self, cid): # 方法1:找到所有要操作的客户数据,把他们变成给我的客户 # Customer.objects.filter(id__in=cid).update(consultant=request.user) # 方法2:把要操作的客户添加到我的客户列表里 self.request.user.customers.add(*Customer.objects.filter(id__in=cid))
def _to_public(self, cid): # 方法1:找到所有要操作的客户数据,把他们的销售字段设置为空 Customer.objects.filter(id__in=cid).update(consultant=None) # 方法2:从我的客户列表里面把指定的客户删除掉 # request.user.customers.remove(*Customer.objects.filter(id__in=cid)
def post(self, request): """批量操作(变公户/变私户)""" print(request.POST) cid = request.POST.getlist('cid') # 要操作的客户的id action = request.POST.get('action') # 判断 self 是否有一个 _action 的方法,如果有就执行,否则就回个 滚 if not hasattr(self, '_{}'.format(action)): return HttpResponse('滚') getattr(self, '_{}'.format(action))(cid) return redirect(reverse('customer_list'))
3. 模糊检索
1. CBV中
1. self.request 其实就是request对象
2. Q对象里面的参数是元祖
3. Q查询的用法
# 根据搜索的关键字过滤customer对象数据 # 获取需要搜索的关键字 query_value = request.GET.get('query','') # 搜索qq,name,qq_name中含有query_value关键字的数据 # 第一种写法 query_set = query_set.filter( Q(qq__icontains=query_value)|Q(name__icontains=query_value)|Q(qq_name__icontains=query_value) ) # 第二种写法 query_set = query_set.filter( Q(('qq__icontains',query_value))|Q(('name__icontains',query_value))|Q(('qq_name__icontains',query_value)) ) # 第三种写法 query_value = request.GET.get('query','') print(query_value) q = Q() q.connector = 'OR' # 默认是AND q.children.append(('qq__icontains',query_value)) q.children.append(('qq_name__icontains',query_value)) q.children.append(('name__icontains',query_value)) query_set = query_set.filter(q) # # 第四种写法 写成一个私有的方法 _get_query() q = self._get_query(['qq','qq_name','name']) query_set.filter(q) page_obj = Pagination(current_page, query_set.count(), url_prefix, per_page=10) data = query_set[page_obj.start:page_obj.end] # 定义一个模糊检索的方法 def _get_query_q(self, field_list, op='OR'): # 从URL中取到query参数 query_value = self.request.GET.get('query', '') q = Q() # 指定Q查询内部的操作是OR还是AND q.connector = op # 遍历要检索的字段,挨个添加子Q对象 for field in field_list: q.children.append(Q(('{}__icontains'.format(field), query_value))) return q
1. Q(name__icontains='帅')
2. Q(('name__icontains', '帅'))
3. 多个Q查询的话可以使用Q对象方式
1. q = Q()
2. q.connector = 'OR'
3. q.children.append(Q(('name__icontains', '帅')))
4. 分页携带检索参数
想办法把查询的键值对添加到页码a标签的href属性中
1. QueryDict对象 from django.http import QueryDict
1. 本质上是dict
2. querydict_obj._mutable=False --> 不能修改
3. querydict_obj['page'] = 1 --> 字典key赋值
4. querydict_obj.urlencode() --> 把字典类型的转换成urlencode
2. 深浅拷贝 --> 回去复习下基础吧(痛心疾首的呐喊!)
5. 新增和编辑跳转回原页面(明天说)
6. 展示、添加和编辑沟通记录
1. 展示沟通记录
1. 数据:必须是我的客户并且删除状态为False
2. 添加沟通记录
def consult_record_list(request): query_set = ConsultRecord.objects.filter(consultant=request.user, delete_status=False) return render(request, 'consult_record_list.html', {'consult_record': query_set})
1. ModelForm --> 把重复的操作提取到BaseForm中
2. 如何给ModelForm设置默认值
3. 如何限制客户字段的选项必须是我的客户
def consult_record(request, edit_id=None): record_obj = ConsultRecord.objects.filter(id=edit_id).first() # None if not record_obj: record_obj = ConsultRecord(consultant=request.user) # 生成一个销售是我的ConsultRecord对象 print(record_obj, id(record_obj)) print('@' * 120) form_obj = ConsultRecordForm(instance=record_obj, initial={'consultant': request.user}) return render(request, 'consult_record.html', {'form_obj': form_obj, 'edit_id': edit_id})