stark元件之批量操作【模仿Django的admin】
阿新 • • 發佈:2018-12-18
一、先看下django的admin是如何實現批量操作
首先在配置類中定義一個函式
然後我們為這個函式物件設定一個屬性,這個屬性主要用來顯示在select標籤中顯示的文字內容
最後把函式物件放到一個actions的列表中
下面看下具體的實現的程式碼
class testbook(admin.ModelAdmin): # 第一步,定義一個函式,必須要接受三個引數 def test_action(self,request,queryset): """ :param request: :param queryset:這個就是需要批量操作的queryset物件 :return: """ print(queryset) # 第二步,為這個函式物件賦值一個新的屬性 test_action.short_description = "測試批量操作的函式" # 第三步,將函式物件新增到actions這個列表中 actions = [test_action]
程式碼已經看完,我們看下具體的實現效果
第一個方法是django自帶的批量操作的函式,第二個方法就是我們自定義的批量操作的函式
至此,Django的admin的批量操作我們已經知道如何配置和使用了,下面我們來看下在我們的stark元件中是如何實現類似的批量操作的
二、下面在我們自己是如何實現類似Django的admin的批量操作
a、在某張表的配置類中定義批量操作的函式,併為這個函式設定相應的屬性
def test_action(self,request,queryset): print(queryset,) actions = [test_action] # test_action.__name__ = "測試批量操作的函式" test_action.short_description = "測試批量操作的函式"
b、我們在看下前端的頁面,這裡我們為什麼要看前端的頁面呢?這裡其實很重要,我們的這個批量操作的按鈕其實要傳送2個數據給後端,一個就是我這次批量操作的函式的名稱,另外一個就是我這次批量操作所選中的資料
首先我們需要把我們的函式物件渲染到select標籤的option標籤中
先把批量操作的函式的名稱和desc放在一個列表中,這個列表的每個元素是一個字典
這個方法,我們寫在showlist這個類中
def get_actions(self): action_list = [] for i in self.config.get_new_action(): name = i.__name__ desc = i.short_description action_list.append({"name":name,"desc":desc}) return action_list
在list_view檢視函式中返回action的操作
action_str = showlist.get_actions() return render(request,"list_view.html",{"data_list":data_list,"title_list":title_list,"page_str":page_str,"search_fields":self.search_fields,"action_str":action_str})
前端渲染select標籤
<select name="func"> <option>----------</option> {% for i in action_str %} } <option value="{{ i.name }}">{{ i.desc }}</option> {% endfor %} </select><input type="submit" value="批量操作" class="btn-info btn">
這裡還需要對check標籤需要加一個id的屬性,不然我們不知道選的是哪個資料
def check(self,obj=None,header=False): if header: return mark_safe("<input id='head_check'type='checkbox'>") else: return mark_safe("<input type='checkbox' class='body_check' name='selectpk' value='{pk}'>".format(pk=obj.id))
因為django的admin預設就有一個批量刪除的操作,我們也要把他這個操作搞起來
首先在父類中定義個actions的函式,這個函式就是批量操作的函式
class Starkclass(object): list_display = ['__str__'] list_display_links = [] search_fields = [] modelformclass = None actions = [] def __init__(self,model,site): self.model = model self.site = site # self.list_display = ["__str__",] def test_action_delete(self,request,queryset): print(queryset,"這裡是父類定義的批量操作") test_action_delete.short_description = "批量刪除操作"
然後我們重新寫一個get_actions的函式,專門用來重組actions操作
def get_new_action(self): new_action_list = [] new_action_list.append(Starkclass.test_action_delete) if self.actions: new_action_list.extend(self.actions) return new_action_list
最後在showlist類中呼叫我們定義個新的方法就可以了
def get_actions(self): action_list = [] for i in self.config.get_new_action(): name = i.__name__ desc = i.short_description action_list.append({"name":name,"desc":desc}) return action_list