zoukankan      html  css  js  c++  java
  • Django--CRM--QueryDict, 模糊搜索, 加行级锁

    一 . QueryDict的修改

    # QueryDict正常是不允许修改的,要想往里面添加内容,需要另mutable=True
    dic = request.GET
    print(dic)   # <QueryDict: { 'query' : ['12']}>
    dic._mutable=True   # 这种的需要加上下划线
    dic['key'] = value    # 这样才可以添加
    
    # 还可以直接实例化,当参数传过去的时候
    from django.http.request import QueryDict
    class Base:
        def __init__(self, params=None)
            self.params = QueryDict(mutable=True)  # 这种也是让它可以修改
    
    还可以实参是request.GET.copy()   # 这是深copy并且可修改
    
    # 当我们需要拿到QueryDict中的数据的时候可以直接dic.urlencode()
    print(dic.urlencode())    #query=12

    二 . 路径跳转拼接

      比如说我们在淘宝首页在没有登录的情况下点击'我的订单',他会让你先去登录,登陆完直接就跳转到'我的订单' ,这里其实就用到了路径拼接的功能

      我们要想做路径拼接跳转需要借助于自定义过滤器来做

    from django import template
    from django.urls import reverse
    from django.http.request import QueryDict
    register = template.Library()
    
    # 用这个的原因是可以传多个参数
    @register.simple_tag
    def reverse_url(request, url_name, *args, **kwargs ):    
        next = request.get_full_path()   # 拿到的是带参数的路径
        qd = QueryDict(mutable=True)
        qd['next'] = next
        base_url = reverse(url_name, args=args, kwargs=kwargs)
        # next=/crm/customer_list/?query=in&page=2   如果不urlencode 这个&之后的东西会被分割这样就会丢参数
            # urlencode之后 next=%2Fcrm%2Fcustomer_list%2F%3Fquery%3Din%26page%3D2
            # 虽然转换了,但是你去get的时候自己还会变回来的
        return '%s?%s' % (base_url, qd.urlencode())

      下面来看看怎么用

    三 . 模糊搜索

      1 . 模糊搜索肯定是要用到上面的request.GET.copy()的,因为我们如果不用会出现条件缺失的情况, 见下图

      

      

      2. 我们在进行模糊搜索的时候需要用到Q查询

      

     四 . POST方式提交数据

      视图函数

    def course_record_change(request, class_id=None, course_record_id=None):
        # 做choices限制条件可以直接models.类(限制条件),这个不跟数据库打交道    要想从数据库拿数据必须要ORM操作(编辑)
        obj = models.CourseRecord(re_class_id=class_id, teacher=request.user_obj) if class_id else models.CourseRecord.objects.filter(
            pk=course_record_id).first()
        form_obj = CourseRecordForm(instance=obj)   # 有instance=obj 显示原始数据(编辑)
    
        if request.method == 'POST':
            form_obj = CourseRecordForm(request.POST, instance=obj)
            if form_obj.is_valid():
                form_obj.save()
                return redirect(reverse('course_record_list', args=class_id))
    
        title = '新增课程记录' if class_id else '编辑课程记录'
        return render(request, 'form.html', {'form_obj': form_obj, 'title': title})

      如果一个字段中有很多的数据,但是根据实际情况我们只需要展示一个,就要进行限制操作

      

      

      

      

    五 . 行级锁

      当数据是共享的时候,我们就要注意一下数据可能在修改的过程中出现问题,公户变私户过程中,两个销售都想把剩下的公户变成私户,但是按理说其中一个把公户变成私户后,另一个人就不能操作了, 想达到这种效果,我们就需要加上行级锁

      行级锁的作用就是当你对一个数据进行操作的时候,其他人只能查看这个数据, 不能操作, 只有你把锁放了,其他人才能进行增删改等操作.

    # 数据库中的行级锁:
        begin;  #  开启事务
        select * from 表名  where 条件 for update;  # 加锁
        commit; #提交事务 这个操作完成后别人才能对这条数据进行操作
              
    # ORM中加行级锁
        from django.db import transaction
             
        with transaction.atomic():  # 事务
            # 方式一  查询的客户
            queryset = models.Customer.objects.filter(pk__in=ids, consultant__isnull=True).select_for_update()  # 加行级锁
            # 根据需要在这里加上判断
            queryset.update(consultant=self.request.user_obj)

     六 . 返回数据的方法

      

    像我们在视图函数中进行操作之后都会return render() 或者return redirect() 或者 return HttpResponse(), 
      但是有的时候我们想要更准确的返回结果,比如公户变私户后,提交数据之后返回公户页面,私户边公户后,然后返回私户,
        但是由于公户和私户这个select框都是在customer_list这个页面里, 如果只是redirect(customer),那么无论是公变私,还是私变公,最后返回的都是select框里面的第一个数据的页面.要想解决这个现象, 我们可以进行以下操作.

      

       

  • 相关阅读:
    补:冲刺Day1
    需求规格说明书2.0
    补:冲刺Day2
    冲刺Day3
    Base64上传图片
    C#怎样通过url调用接口
    js键盘控制DIV移动
    利用MVC的过滤器实现url的参数加密和解密
    在.net MVC中异步上传图片或者文件
    mvc url路由参数的加密和解密
  • 原文地址:https://www.cnblogs.com/attila/p/10549076.html
Copyright © 2011-2022 走看看