接續昨天的內容,我們今天要來實做表單送出並新增資料到資料表的功能。
先來複習我們昨天表單的原始碼 :
<h1>Add member</h1>
<form action="addrecord/" method="post">
{% csrf_token %}
First Name:<br>
<input name="first">
<br><br>
Last Name:<br>
<input name="last">
<br><br>
<input type="submit" value="Submit">
</form>
在我們提交表單後,資料會被POST
到member/add/addrecord/
這個路徑,然後準備做下一步的處理,而要如何處理收到的資料,依靠的還是URLs
和Views
的配合。
我們接下來需要先在members
的views.py
新增收到對路徑member/add/addrecord/
請求的處理方法,然後在urls.py
裡,新增相應的路徑用來正確指向、設定處理路徑請求的view
方法和給定路徑別名。
在members/views.py
裡面新增addrecord
方法用來處理表單送出後產生的請求並把收到的資料新增到資料表上。
from django.http import HttpResponse, HttpResponseRedirect #1
from django.template import loader
from django.urls import reverse #2
from .models import Members
def index(request):
mymembers = Members.objects.all().values()
template = loader.get_template('index.html')
context = {
'mymembers': mymembers,
}
return HttpResponse(template.render(context, request))
def add(request):
template = loader.get_template('add.html')
return HttpResponse(template.render({}, request))
#本次新增的內容
def addrecord(request):
x = request.POST['first'] #3
y = request.POST['last'] #4
member = Members(firstname=x, lastname=y) #5
member.save() #6
return HttpResponseRedirect(reverse('index')) #7
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
的請求。
在members/urls.py
的urlpatterns
裡面,新增到add/addrecord
的路徑、指定處理請求的view
方法和設定路徑別名。
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'), #1
]
members/add/addrecord
的路徑,以members/views.py
的addrecord
處理請求並給定路徑別名addrecord
修改完URLs
後,表單便可找到處理資料的路徑,接下來看看成果吧!
打開CMD
並切換到虛擬環境(python venv
)的資料夾路徑下
(實際venv
路徑不一定會跟我一樣喔!)
輸入以下指令啟動虛擬環境
Scripts\activate.bat
啟動虛擬環境後結果如下:
接著切換路徑到Django Project所在的資料夾下
接著輸入以下指令Start Server
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
您好再進行post/get的時候要怎麼讓button知道我是把值傳到哪一個function裡面,我嘗試做了簡單的post但都不是我想要的結果