1. 程式人生 > >stark元件之批量操作【模仿Django的admin】

stark元件之批量操作【模仿Django的admin】

一、先看下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