1. 程式人生 > >django中的admin組件之自定義組件的search,actions,list_display_links

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

試圖 pull back arch 條件 let 所有 spl com

上節回顧:

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中的代碼量。

技術分享圖片

技術分享圖片

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