zoukankan      html  css  js  c++  java
  • 模拟admin组件自己开发stark组件之搜索和批量操作

    搜索相关,搜索的本质就是从数据库查询出来的数据过滤

    用户自定义给出过滤条件joker.py

    list_display = ('id','title','price',)
    show_add_btn = True
    model_form_class = BookModelForm  # 自己定制 form

    config类中就需要有如下代码

     # 搜索 方法
            self.search_key = "q"  类属性
    
    #====================================================搜索,注意字段的格式 以下是方法
        show_search_form = False
        def get_show_search_form(self):   # 取决于用户自定义,是否显示
            return self.show_search_form
    
        search_fields = []        # 用户自定义搜索字段,默认显示所有
        def get_search_fields(self):
            result = []
            if self.search_fields:
                result.extend(self.search_fields)
            return result
    
        def get_search_condition(self):   # 得到字段,还有用户输入的搜索字段,让他们去模糊匹配
            key_word = self.request.GET.get(self.search_key) # 请求的 q 的值,类属性
            search_fields = self.get_search_fields()     #   用户 自己 传过来过滤的 字段  'title__contains','price',
            condition = Q()    # 利用Q 查询
            condition.connector = 'or'   # Q 或者查询
            if key_word and self.show_search_form:  # 有默认搜索值,并且前端开启页面
                for field_name in search_fields:   #  'title__contains','price',
                    condition.children.append((field_name,key_word))   # title=Q的值ORprice=Q的值
                print(condition)
    
            return condition    # 如果用户没有自定义,我们默认就是所有数据,没有任何的过滤信,将返回值给数据库FILTER就可以过滤条件
     # 搜索框 数据获取
            queryset = self.model.objects.filter(self.get_search_condition())  # 过滤条件
    
            cls = ChangList(self,queryset)  # 另一个类
       changlist 下面的方法

      elf.show_search_form = config.get_show_search_form() # 类属性
      self.search_form_val = config.request.GET.get(config.search_key,'')
      def head_list(self):
            # list_display = (checkbox,"id","title",edit,delete)
    
            # 处理表头,也就是第一行内容,如果数据库有verbose_name字段,就会拿到这个名称
            head_list = []
            print(self.list_display)
            ###  [<function JokerConfig.checkbox at 0x104e4cea0>, 'id', 'title', <function JokerConfig.edit at 0x104e4cd90>, <function JokerConfig.delete at 0x104e4ce18>]
            for i in self.list_display:
                print(i)
    
            for field_name in self.list_display:  # id title edit
                if isinstance(field_name, str):
                    ###### 字符串,肯定就是字段了,例如 title字段到这里,就会得到verbose_name名字,如果没有verbose_name那就是本身名称
                    verbox_name = self.model_class._meta.get_field(field_name).verbose_name
                else:
                    print(111111)
                    # checkbox edit走这里
                    verbox_name = field_name(self.config, is_header=True)  ##### 判断是不是头
                head_list.append(verbox_name)
            if not self.list_display:  ####    没有list_display
                head_list = ['选择', self.model_class._meta.model_name.upper(), ]
    
            print('==head_list==', head_list)  # ['ID', '书籍名称', 'op']
            return head_list
    
        def body_list(self):
            # 处理数据
            data_list = self.page_list      # 切分后数据
            print('==data_list==', data_list)  # <QuerySet [<Book: linux>, <Book: python>, <Book: go>]>
    
            new_data_list = []  # [[1, 'linux', "<a href='1/chagnge'>edit</a>"], [2, 'python', "<a href='2/chagnge'>edit</a>"], [3, 'go', "<a href='3/chagnge'>edit</a>"]]
    
            for obj in data_list:  # 每一个对象   obj obj obj obj 是每一本书籍
                temp = []
    
                if not self.list_display:  # 没有dis_play,给予默认头,信息,显示对象
                    temp.append(self.config.checkbox(obj))
                    temp.append(obj)
                else:
                    for field_name in self.list_display:  # (checkbox,"id","title",edit,delete)
                        if isinstance(field_name, str):
                            var = getattr(obj, field_name)  # 拿到对象相对应的字段的值
                        else:
                            var = field_name(self.config, obj)  # 不是对象里面的字段,执行自己样式方法,但是我要把这个obj传过去,为了修改删除
                        temp.append(var)
    
                new_data_list.append(temp)
    
            print('==new_data_list==', new_data_list)
            return new_data_list

    批量删除,用户自定义批量选择项,自定义处理机制

      ####= ======= 批量 相关
        show_actions = True
        def multi_del(self, request):
            checkid_list = request.POST.getlist('checkid')   # 批量传过来的是 主键的 对象
            # self.model.objects.filter(id__in=pk_list).delete()   # model就是注册了的数据库
            return HttpResponse('删除成功')
    
        multi_del.short_desc = "自定义批量删除"
    
        def multi_init(self, request):
            checkid_list = request.POST.getlist('checkid')
            return HttpResponse('初始化成功')
    
        multi_init.short_desc = "自定义批量初始化"
    
        actions = [multi_del, multi_init]

    config类中就有了如下代码

    #=========================================================action批量
        show_actions = False
        def get_show_actions(self):  # 是否显示批量框
            return self.show_actions
    
    
        def select_del(self,request):   # 默认删除操作
            checkid_list = request.POST.getlist('checkid')  # 待删除数据
            print('======')
            # return render(request, 'joker/pi_view.html', locals())
            return HttpResponse('默认删除成功')
    
        select_del.short_desc =  '默认删除'
    
        actions = []
        def get_actions(self):
            default_actions = [self.select_del]
            if self.actions:   # 如果用户自定义有值
                default_actions.extend(self.actions)     #multi_del, multi_init
            print('========',default_actions)
            return default_actions
    ### action  类属性
            self.actions = config.get_actions()    # congi类里面有自定义函数传过来的函数地址
            self.show_actions = config.get_show_actions()
      # 批量 显示
            if request.method == 'POST' and self.get_show_actions():  # 有数据,开启显示,批量删除操作
                func_name_str = request.POST.get('list_action')    # 前端的SELECT的NAME属性的值,对应的是当前选中的是哪个函数
                print('select',func_name_str)
                action_func = getattr(self, func_name_str)   # 通过选中的批量函数,利用反射获取
                print(request.POST)  #request里面包含了选中的数据信息,通过FORM提交
                ret = action_func(request)   # multi_del, multi_init select_DEL执行
    
                if ret:
                    return ret
  • 相关阅读:
    nginx
    vue拦截
    时间转化封装
    Vue粒子特效(vue-particles插件)
    vscode 使用ESLint 自动检查,保存时自动格式化
    小程序请求封装
    common.js
    h5常见
    封装promise
    promise使用
  • 原文地址:https://www.cnblogs.com/jokerbj/p/8411813.html
Copyright © 2011-2022 走看看