數據增加與修改對於Django來說,都是通過save()方法來實現的。只是在修改數據的時候,需要獲取相關數據條目的id給頁面,並將數據傳遞至修改頁面。
1. 在urls.py中增加修改數據的url項:
urls.py:
urlpatterns = [
#...
#修改數據,?P<pk>\d+代表穿過來的id值,且id值一定爲數字
url(r'^edit/(?P<table>\w+)/(?P<pk>\d+)/$', echo.views.edit, name='edit'),
]<strong>
</strong>
2. 在views.py中增加edit的函數,大部分與add函數類似,但是需有pk參數(即某行數據的id值)
#修改數據,函數中的pk代表數據的id
def edit(request, table, pk):
if table == 'line':
#這是Django的一個快捷方法,通過pk去line表中取值,如果有值則返回,如果無值則拋出http404的異常
#具體信息可參考https://docs.djangoproject.com/en/1.9/topics/http/shortcuts/
table_ins = get_object_or_404(Line, pk=pk)
#通過instance來將Form的數據做填充
form = LineForm(request.POST or None, instance=table_ins)
sub_title = '修改線路信息'
if table == 'node':
table_ins = get_object_or_404(Node, pk=pk)
form = NodeForm(request.POST or None, instance=table_ins)
sub_title = '修改機構信息'
if table == 'device':
table_ins = get_object_or_404(Device, pk=pk)
form = DeviceForm(request.POST or None, instance=table_ins)
sub_title = '修改設備信息'
#判斷form是否有效
if form.is_valid():
#創建實例,需要做些數據處理,暫不做保存
instance = form.save(commit=False)
#將登錄用戶作爲登記人,在修改時,一定要使用str強制,因爲數據庫中以charfield方式存放了登記人
if table == 'node':
instance.node_signer = str(request.user)
if table == 'line':
instance.line_signer = str(request.user)
if table == 'device':
instance.device_signer = str(request.user)
#保存該實例
instance.save()
#跳轉至列表頁面,配合table參數,進行URL的反向解析
return redirect('lists', table=table)
context = {
'table': table,
'form': form,
'sub_title': sub_title,
}
#與res_add.html用同一個頁面,只是edit會在res_add頁面做數據填充
return render(request, 'res_add.html', context)
3. 修改res_list.html的頁面,增加編輯信息的href,並將參數傳遞給url
{% for item in data %}
<tr>
<!--通過for循環從data取出的具體表格內容-->
<!—代碼省略-->
<div class="hidden-sm hidden-xs action-buttons">
<!--編輯信息按鈕,同時獲取item.id,傳遞給url-->
<a class="green" href="{% url 'edit' table item.id %}" title="編輯信息">
<i class="ace-icon fa fa-pencil bigger-130"></i>
</a>
<!—代碼省略-->
</div>
<!--頁面收縮時的按鈕佈局-->
<div class="hidden-md hidden-lg">
<div class="inline position-relative">
<!—代碼省略-->
<li>
<!--編輯信息按鈕,同時獲取item.id,傳遞給url-->
<a class="green" href="{% url 'edit' table item.id %}" title="編輯信息">
<span class="green">
<i class="ace-icon fa fa-pencil-square-o bigger-120"></i>
</span>
</a>
</li>
<!—代碼省略-->
{% endfor %}
<!—代碼省略-->
4. 通過修改按鈕來修改線路信息,可以發現原先的數據已經被填充在了FORM中
修改相關參數並提交,可以發現相應數據已經被修改。