模擬admin組件自己開發stark組件之搜索和批量操作
阿新 • • 發佈:2018-02-04
btn 但是 相關 操作 else htm actions 函數 自己
搜索相關,搜索的本質就是從數據庫查詢出來的數據過濾
用戶自定義給出過濾條件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
模擬admin組件自己開發stark組件之搜索和批量操作