第75篇 公户与私户的设置 action反射 模糊检索


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})

  

猜你喜欢

转载自www.cnblogs.com/cavalier-chen/p/10004431.html