繼 Day18,我們講完了 Django 的 ModelForm,而其方法便是直接透過 Model 來創建 Form,讓我們能夠更方便地去處理資料庫。
然而,有時候我們不需要直接將使用者所輸入的內容存進資料庫,而是針對使用者填入的內容做處理及判斷,最後再做出相對應的處理,e.g. 這時候我們便能夠使用 Django 所提供的 Form
也因為我們並不是透過 Model 來創建這一個 Form 的緣故,我們 創建Form
就像 創建Model的資料庫型態
一樣
聽起來很抽象,那直接帶大家看例子!
我們先再 forms.py
創建一個 RawVendorForm
# 創建一個 Raw Form
class RawVendorForm(forms.Form):
vendor_name = forms.CharField()
store_name = forms.CharField()
phone_number = forms.CharField()
# Model - Vendor
class Vendor(models.Model):
vendor_name = models.CharField(max_length = 20) # 攤販的名稱
store_name = models.CharField(max_length = 10) # 攤販店家的名稱
phone_number = models.CharField(max_length = 20) # 攤販的電話號碼
address = models.CharField(max_length = 100) # 攤販的地址
從上面的 Raw Form 與 Model 做比較,是不是覺得兩個非常相似?
而這就跟我上面所說的是同一件事情, 創建Form 就跟 創建Model 很像
接下來! 就跟 ModelForm 一樣,將 Form 引用到 views.py
from .forms import RawVendorForm # 新增 RawVendorForm
# 新增
def vendor_create_view(request):
form = RawVendorForm(request.POST or None)
if form.is_valid():
print(form.cleaned_data)
form = VendorForm()
context = {
'form' : form
}
return render(request, "vendors/vendor_create.html", context)
而這裡做的事情,是可以完全仿照出 ModelForm 來完成的
完成 創建Form 以及 修改view 這兩件事情以後,我們試著填入我們的資料
只要我們所填入的資料,驗證成功之後,就會隨之產生出cleaned_data
,而 form.cleaned_data的型態便是一個Dict
{'vendor_name': 'TC', 'store_name': '130', 'phone_number': '13579'}
而我們要將這個資料新增到 Model - Vendor 裡面,就要將 view 修改如下
def vendor_create_view(request):
form = RawVendorForm(request.POST or None)
if form.is_valid():
Vendor.objects.create(**form.cleaned_data) # 新增
form = RawVendorForm()
context = {
'form' : form
}
return render(request, "vendors/vendor_create.html", contex
**form.cleaned_data
: 因為 create 裡面所帶的參數為 **kwargs
,故傳入 Dict 就必須加上 ** 來 unpack
form 不像是 modelform 一樣具備 save() 可以直接儲存資料的功能,所以只能透過ORM的方式來存取
你問我怎麼沒有地址,
因為我的form沒有建立地址阿xD
關於 form 及 modelform 的使用時機,在網路上並找不到一個很明確的說法,因為大多數的事情,雙方都能夠辦的到,而目前為止我找到最有幫助的訊息就是
All form classes are created as subclasses of either django.forms.Form or django.forms.ModelForm. You can think of ModelForm as a subclass of Form. Form and ModelForm actually inherit common functionality from a (private) BaseForm class, but this implementation detail is rarely important.
In fact if your form is going to be used to directly add or edit a Django model, a ModelForm can save you a great deal of time, effort, and code, because it will build a form, along with the appropriate fields and their attributes, from a Model class.
從官網上找到的資訊,可以得知 ModelForm 是來自 Form 的產物,而會有這樣的設計,最大的目的還是為了,幫你省下去做重複事情大量的時間,透過 ModelForm 你可以更方便的去操作資料庫
今天大致上講到這裡
今天的時間真的是擠出來的 From BY
10/20 - 小更