数据增加与修改对于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中
修改相关参数并提交,可以发现相应数据已经被修改。