1. 程式人生 > 實用技巧 >Xadmin控制元件的實現:〇四查詢檢視三——list檢視封裝

Xadmin控制元件的實現:〇四查詢檢視三——list檢視封裝

到現在為止,我們已經為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 = request
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
List_View程式碼

這裡要注意的地方就是貼程式碼的時候,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程式碼。