iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
Modern Web

Django 初心者之旅系列 第 15

【Day 15】網頁新增紀錄到資料庫資料表 (下)

  • 分享至 

  • xImage
  •  

接續昨天的內容,我們今天要來實做表單送出並新增資料到資料表的功能。
先來複習我們昨天表單的原始碼 :

<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>

在我們提交表單後,資料會被POSTmember/add/addrecord/這個路徑,然後準備做下一步的處理,而要如何處理收到的資料,依靠的還是URLsViews的配合。

我們接下來需要先在membersviews.py新增收到對路徑member/add/addrecord/請求的處理方法,然後在urls.py裡,新增相應的路徑用來正確指向、設定處理路徑請求的view方法和給定路徑別名。

修改 Views

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
  1. HttpResponseRedirectHttpResponsesubclass,用來做路徑的重新導向

  2. reverse的功能是允許使用前面說過的path別名,來找到對應的路徑和相應的view方法

  3. 我們的表單是以POST的方式,將資料含在HttpRequest裡寄出,那我們當然要去找HttpRequest物件(request)的POST屬性拿資料。從POST這個屬性拿到的資料,它本身會是個QueryDict,也就是Python裡為人熟知的Key-Value結構。因此我們會用POST['first']的形式去拿到表單name=first的資料值。

  4. 同上,我們用POST['last']的形式去拿到表單name=last的資料值。

  5. 把剛拿到的資料值用來建立Members物件即要新增到資料表的新紀錄(Record)並以變數member承接

  6. 實際將這筆新的紀錄(Record)存放到資料表上

  7. HttpResponseRedirect用來重新導引路徑,而後面的reverse('index'),則可以把它想成path('', views.index, name='index'),也就是新增完資料後跳轉回members/

修改完Views接著修改URLs,讓Django能正確處理對members/add/addrecord的請求。

修改 URLs

members/urls.pyurlpatterns裡面,新增到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
]
  1. 設定到members/add/addrecord的路徑,以members/views.pyaddrecord處理請求並給定路徑別名addrecord

修改完URLs後,表單便可找到處理資料的路徑,接下來看看成果吧!

啟動 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/),接著點擊下方連結進入表單頁面

  6. 接著輸入表單資料並送出

  7. 最後,跳轉回到127.0.0.1:8000/members/就可以看到剛剛新增的資料

這樣就學會如何在網頁上新增資料表紀錄(Record)囉! 明天會是對 CSRF Token 做簡略補充的番外篇。

補充資料

Django Documentation - Request and response objects
Django Documentation - django.urls.reverse


上一篇
【Day 14】網頁新增紀錄到資料庫資料表 (上)
下一篇
【Day 16】Django Template Tags 番外篇 – CSRF Token
系列文
Django 初心者之旅31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
rtfgvb74125
iT邦新手 4 級 ‧ 2022-12-05 12:04:23

您好再進行post/get的時候要怎麼讓button知道我是把值傳到哪一個function裡面,我嘗試做了簡單的post但都不是我想要的結果

我要留言

立即登入留言