django中的admin組件之自定義組件的search,actions,list_display_links


 上節回顧:
               
                1 反向解析(reverse)
                2 modelForm---》添加和編輯
                    
                    添加:
                        class BookModelForm(): 
                            class Meta:
                                    model=Book
                                    fields="__all__"
                        
                        def add(reqeust):
                                if GET:
                                    form=BookModelForm()                                
                                    return render(request,"add.html",{"form":form})
                                else:
                                    form=BookModelForm(request.POST)
                                    if form.is_valid():
                                         form.save() # create 
                                    else:
                                        return render(request,"add.html",{"form":form})
                                        
                                '''
                                add.html:
                                <form action="" method="post" novalidate>
                                      {% csrf_token %}
                                      {% for field in form %}
                                      <div class="form-group">
                                          <label for="">{{ field.label  }}</label>
                                          {{ field }} 
                                          <span class="error pull-right" style="color: red">{{ field.errors.0 }}</span>
                                      </div>
                                      {% endfor %}

                                    <input type="submit">
                                </form>
                                    
                                '''
                                         
                                                          
                        def edit(reqeust,id):
                                edit_obj=Book.objects.get(pk=id)
                                if GET:
                                    form=BookModelForm(instance=edit_obj)                                
                                    return render(request,"edit.html",{"form":form})
                                else:
                                    form=BookModelForm(request.POST,instance=edit_obj)
                                    if form.is_valid():
                                         form.save() # update 
                                    else:
                                        return render(request,"edit.html",{"form":form})            
                                 
                
                3 刪除
                
            
                4  分頁:保存搜索條件

今日內容:

寫到這里我們發現我們list試圖函數中的代碼有很多,所以我們想着把把里面的一寫功能寫成一個類,減少lisetview視圖函數的負擔。

我們在上面創建一個類class ShowList,這個類專門寫我們所有展示相關的功能,那這個類怎么寫呢?

很簡單:將視圖函數中的功能,在這類中寫成函數。但是這時候會有很多飄黃的地方,這時候我們就會想到有類肯定會有self,但是新創建的這個類中self和我們復制過來的self是不一樣的。所以在試圖函數中引用這個類的時候,要將試圖函數中self傳進去。showlist = ShowList(self,data_list,request)

 在這個類中我們用config_obj來接受傳過來的self,所以,我們原來視圖函數中的self現在指 的是self.config_obj,將他們替換過來就好了。

現在我們將分頁器加在這個list試圖里面。

新建一個py文件,我們現在把之前寫的分頁放在我們的stark組建里。

這個分頁部分當然也要寫在我們要封裝的ShowList的類中,根據分頁,傳進去相應的參數就行。(可以把分頁的原理看一下,)

現在我們來實現一下list_display_links部分,

我們要現在默認配置類中添加list_display_links = [] ,這樣一個變量。

然后我們想,這一部分要添加進哪呢?當我們點擊具體的某個字段的時候,就能夠跳轉到編輯的頁面中去,並且實現編輯那一列消失。應該是要添加進表單部分,在表單部分進行判斷,所以:

那操作那一列是怎么消失的呢?

這樣就行了。

接下來就是寫search功能了

先在頁面中添加這么一個html。

先來想一下需求,當我們點擊搜索按鈕時,要拿到搜索的內容之后和數據庫中進行匹配,然后展示匹配的內容,這是個get請求。

現在默認配置類中添加一個變量search_fields = [],我們現在是這么想的,data_list是所有的數據,現在我們要根據search條件過濾,然后交給showlist展示。

我們介紹一個新的知識點,

所以我們這樣寫:

接下來就是actions部分了

在我們checkbox的input標簽中,

 

現在頁面中添加html:

          <label>Action:</label>
                <select name="action" class="form-control" style="display: inline-block;width: 300px" >
                    <option value="" selected="">---------</option>
                    {% for action in showlist.get_new_actions %}
                        <option value="{{ action.name }}">{{ action.text }}</option>
                    {% endfor %}
                </select> 

我們先來想一想,當我們點擊checkbox的時候然后進行action,所以說這個action部分和下面的表單應該是要在一個form里面的,是一個post請求。

同樣要先在默認配置類中添加一個變量,actions= [],我們想當我們點擊checkbox的時候,要獲取到那一條數據,拿到的是checkbox標簽中的name和value值,然后對那一條數據的某一個字段進行初始化。

我們要構建一個新的action列表,這個列表中既要有自定義配置類的action又要有默認配置類的action。那這個列表應該怎么構建?[{'name': 'patch_init', 'text': '價格初始化'}, {'name': 'patch_delete', 'text': '刪除數據'}]

試圖函數中這樣寫:

 這樣就可以了 。

然后我們再來看一下這個的listview中的代碼量。

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM