接續昨天的內容,我們今天要來實做表單送出並新增資料到資料表的功能。
先來複習我們昨天表單的原始碼 :
1 | <h1>Add member</h1> |
在我們提交表單後,資料會被POST
到member/add/addrecord/
這個路徑,然後準備做下一步的處理,而要如何處理收到的資料,依靠的還是URLs
和Views
的配合。
我們接下來需要先在members
的views.py
新增收到對路徑member/add/addrecord/
請求的處理方法,然後在urls.py
裡,新增相應的路徑用來正確指向、設定處理路徑請求的view
方法和給定路徑別名。
修改 Views
在members/views.py
裡面新增addrecord
方法用來處理表單送出後產生的請求並把收到的資料新增到資料表上。
1 | from django.http import HttpResponse, HttpResponseRedirect #1 |
-
HttpResponseRedirect
是HttpResponse
的subclass
,用來做路徑的重新導向 -
reverse
的功能是允許使用前面說過的path
別名,來找到對應的路徑和相應的view
方法 -
我們的表單是以
POST
的方式,將資料含在HttpRequest
裡寄出,那我們當然要去找HttpRequest
物件(request
)的POST
屬性拿資料。從POST
這個屬性拿到的資料,它本身會是個QueryDict
,也就是Python
裡為人熟知的Key-Value
結構。因此我們會用POST['first']
的形式去拿到表單name=first
的資料值。 -
同上,我們用
POST['last']
的形式去拿到表單name=last
的資料值。 -
把剛拿到的資料值用來建立
Members
物件即要新增到資料表的新紀錄(Record
)並以變數member
承接 -
實際將這筆新的紀錄(
Record
)存放到資料表上 -
HttpResponseRedirect
用來重新導引路徑,而後面的reverse('index')
,則可以把它想成path('', views.index, name='index')
,也就是新增完資料後跳轉回members/
修改完Views
接著修改URLs
,讓Django
能正確處理對members/add/addrecord
的請求。
修改 URLs
在members/urls.py
的urlpatterns
裡面,新增到add/addrecord
的路徑、指定處理請求的view
方法和設定路徑別名。
1 | from django.urls import path |
- 設定到
members/add/addrecord
的路徑,以members/views.py
的addrecord
處理請求並給定路徑別名addrecord
修改完URLs
後,表單便可找到處理資料的路徑,接下來看看成果吧!
啟動 Server 檢視成果
-
打開
CMD
並切換到虛擬環境(python venv
)的資料夾路徑下(實際
venv
路徑不一定會跟我一樣喔!) -
輸入以下指令啟動虛擬環境
1
Scripts\activate.bat
啟動虛擬環境後結果如下:
-
接著切換路徑到Django Project所在的資料夾下
-
接著輸入以下指令
Start Server
1
py manage.py runserver
-
在瀏覽器輸入對應的網址(
127.0.0.1:8000/members/
),接著點擊下方連結進入表單頁面 -
接著輸入表單資料並送出
-
最後,跳轉回到
127.0.0.1:8000/members/
就可以看到剛剛新增的資料
這樣就學會如何在網頁上新增資料表紀錄(Record)囉! 明天會是對 CSRF Token 做簡略補充的番外篇。
補充資料
Django Documentation - Request and response objects
Django Documentation - django.urls.reverse