十一.增加數據修改功能

數據增加與修改對於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中

     

修改相關參數並提交,可以發現相應數據已經被修改。





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