十一.增加数据修改功能

数据增加与修改对于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中

     

修改相关参数并提交,可以发现相应数据已经被修改。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章