模拟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