iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0
Modern Web

Django 初心者之旅系列 第 19

【Day 19】網頁更新資料庫資料表紀錄 (下)

  • 分享至 

  • xImage
  •  

接續昨天的內容,今天要來實作送出表單(Submit)去更新資料表資料的功能,不過在此之前,先讓我們回顧一下昨天表單的原始碼。

<h1>Update member</h1>

<form action="updaterecord/{{ mymember.id }}" method="post">
{% csrf_token %}
First Name:<br>
<input name="first" value="{{ mymember.firstname }}">
<br><br>
Last Name:<br>
<input name="last" value="{{ mymember.lastname }}">
<br><br>
<input type="submit" value="Submit">
</form>

從上面的原始碼可以看到,當按下Submit按鈕後,資料會被傳到action屬性設定的updaterecord/{{ mymember.id }}這個位址進行處理,且資料的傳遞方法採用post的方式。

然後我們可以依據表單的原始碼,做出以下判斷並逐步實作 :

  1. 需要在members/views.py撰寫名為updaterecord的方法,且方法是帶有requestid這2個參數的版本。
  2. 需要在members/urls.py新增到updaterecord/{{ mymember.id }}path,且這個path要使用帶有參數的特殊格式。

實際上點擊Submit後,資料傳送目的地的完整位址是members/update/updaterecord/{{ mymember.id }}

修改 Views

members/views.py新增1個方法updaterecord,用來處理更新資料表資料的請求 :

#上面的東西都沒變所以省略...
#本次新增的內容
def updaterecord(request, id): #1
  first = request.POST['first'] #2
  last = request.POST['last'] #3
  member = Members.objects.get(id=id) #4
  member.firstname = first #5
  member.lastname = last #6
  member.save() #7
  return HttpResponseRedirect(reverse('index')) #8
  1. 因為path本身帶有參數的關係,所以在urls.py裡面,updaterecord方法實際會以updaterecord(request,id)的形式被呼叫。
  2. 我們可以從送出表單所產生的HttpRequest(即request)物件的POST屬性取得資料值,至於POST它是Key-Value的形式,這也是為什麼這邊要用request.POST['first']的形式去取得表單上name=first那欄的資料。
  3. 同上,取得表單上name=last那欄的資料
  4. 以獨一無二的id值將要更新的資料表資料(Record)抓出來。
  5. 使用類似物件導向的方式指定資料的firstname欄位要更新的值(即first)。
  6. 使用類似物件導向的方式指定資料的lastname欄位要更新的值(即last)。
  7. 將這次對資料(Record)的修改存到資料表,也就是更新資料表資料。
  8. 透過reverse('index')找到別名為indexpath,再藉著HttpResponseRedirect將頁面重新導向指定路徑(即最初的資料表格頁面)。

修改 URLs

按下提交更新資料表單的同時,會對members/update/updaterecord/{{ mymember.id }}這個位址發出請求,所以我們需要在members/urls.pyurlpatterns新增1個path,讓該路徑變成可以訪問的狀態。

members/urls.py改成下方這樣 :

from django.urls import path

from . import views

urlpatterns = [
  path('', views.index, name='index'),
  path('add/', views.add, name='add'),
  path('add/addrecord/', views.addrecord, name='addrecord'),
  path('delete/<int:id>', views.delete, name='delete'),
  path('update/<int:id>', views.update, name='update'),
  path('update/updaterecord/<int:id>', views.updaterecord, name='updaterecord'), #1
]
  1. 因為需要靠id值來正確更新資料表上的資料,所以這邊也是用帶有參數的path格式。後方負責處理請求的updaterecord方法(view)會以updaterecord(request,id)的形式被呼叫。

到這邊為止,在網頁更新資料庫資料表紀錄的功能就完全實作完畢了,接著來看成果吧!

啟動 Server 檢視成果

  1. 打開CMD並切換到虛擬環境(python venv)的資料夾路徑下

    (實際venv路徑不一定會跟我一樣喔!)

  2. 輸入以下指令啟動虛擬環境

    Scripts\activate.bat
    

    啟動虛擬環境後結果如下:

  3. 接著切換路徑到Django Project所在的資料夾下

  4. 接著輸入以下指令Start Server

    py manage.py runserver
    

  5. 在瀏覽器輸入對應的網址(127.0.0.1:8000/members/),接著點擊任意資料紀錄的update進入更新資料表單

  6. 將輸入框內容改成要更新的欄位值

  7. 更改完畢並確認後,點擊Submit送出資料後會跳轉回資料表格頁,於頁面中即可看到資料已更新

我們目前已經學會實作在網頁上新增、刪除、更新資料表資料的功能。而在接下來的蠻長一段時間,都會是對Django Template Tags的補充內容。


上一篇
【Day 18】網頁更新資料庫資料表紀錄 (上)
下一篇
【Day 20】Django Template Tags 補充篇(1) – If & Logical Operators
系列文
Django 初心者之旅31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言