Xadmin控制元件的實現:〇四查詢檢視三——list檢視封裝
阿新 • • 發佈:2020-08-16
到現在為止,我們已經為list檢視添加了分頁、顯示錶頭、顯示資料內容,新增制定按鈕、選擇器等功能。結果就是list函式比較臃腫,下面我們就要考慮一下怎麼把list檢視函式進行一下封裝。
我們看一下現有的ConfXadmin類裡的部分函式
因為list函式呼叫的多個函式,而這些函式之間還有可能是互相牽扯的,所以這裡就不太適合按照函式的形式來封裝,這裡就應該按照類的形式來封裝
顯示類的構造就現有的檢視目的來說,list檢視主要有兩個部分:欄位標題的顯示和資料內容的顯示,所以我們把標題和內容分別封裝到兩個方法裡
class List_View(): def __init__(self):pass def get_title(self): pass def get_data(self): pass
下面要做的就是把前面list_view裡的部分函式直接貼過來
1 class List_View(): 2 def __init__(self,conf_obj,data_list,request): 3 self.conf_obj = conf_obj 4 self.data_list = data_list 5 self.request = requestList_View程式碼6 7 #標題顯示 8 def get_title(self): 9 10 field_title_list = [] 11 for field in self.conf_obj.get_display_field(): 12 if callable(field): 13 field_title = field(self.conf_obj,get_title=True) 14 else: 15 16 if field == '__str__': 17 field_title = self.conf_obj.model_name.upper() 18 else: 19 field_title = self.conf_obj.model._meta.get_field(field).verbose_name 20 21 field_title_list.append(field_title) 22 23 return field_title_list 24 25 #內容顯示 26 def get_data(self): 27 show_data_list = [] 28 29 #分頁 30 page = int(self.request.GET.get('page',1)) 31 32 data_totle = self.data_list.count() 33 page_cut = Page_Cut(page=page, 34 url_prefix=self.conf_obj.get_list_url(), 35 param=self.request.GET, 36 data_totle=data_totle) 37 38 cut_html = page_cut.page_html 39 40 cut_data = self.data_list[page_cut.ID_start:page_cut.ID_end] 41 42 for model_obj in cut_data: 43 temp = [] 44 45 for field in self.conf_obj.get_display_field(): 46 if callable(field): 47 val = field(self.conf_obj,model_obj) 48 else: 49 val = getattr(model_obj,field) 50 temp.append(val) 51 52 show_data_list.append(temp) 53 54 return show_data_list,cut_html 55
這裡要注意的地方就是貼程式碼的時候,self在貼到List_View類裡以後隨著呼叫方發生改變,self代指的物件也就不一樣了。注意在原函式中,原先的self是ConfXadmin類裡的呼叫的,所以我們需要來List_Vist在例項化的時候把這個self傳過去
1 def list_view(self,request): 2 new_data_url = self.get_add_url() 3 all_data = self.model.objects.all() 4 5 view_obj = List_View(self,all_data,request) 6 7 8 field_title_list = view_obj.get_title() 9 10 show_data_list,cut_html = view_obj.get_data() 11 12 return render(request,'list.html',locals())
注意第5行裡的例項化的過程,這個self代表的是什麼。
而在後期我們需要修改檢視的時候,只要修改那個類就行啦。
模板的渲染由於我們只是修改了list_view()檢視,然後在render的時候通過locals()傳遞的模板變數。所以list.html檔案我們是不用修改的。
其實 還有一種渲染模板的方法,就是直接把例項化的物件傳過去,然後在模板中直接呼叫
{{view_obj.get_title}}
這樣就拿到了檢視中的view_obj物件。然後可以通過for迴圈生成需要的html程式碼。