1. 程式人生 > >模擬admin組件自己開發stark組件之搜索和批量操作

模擬admin組件自己開發stark組件之搜索和批量操作

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組件之搜索和批量操作