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中的代碼量。
django中的admin組件之自定義組件的search,actions,list_display_links