iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 19
1
Modern Web

From Django 1.11 to Django 2.1 系列 第 19

Day19 : Django Form

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 這兩件事情以後,我們試著填入我們的資料
https://ithelp.ithome.com.tw/upload/images/20181019/20111829iZSlD010XQ.jpg

只要我們所填入的資料,驗證成功之後,就會隨之產生出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的方式來存取

https://ithelp.ithome.com.tw/upload/images/20181019/20111829qIAAm8vsyG.jpg

你問我怎麼沒有地址,因為我的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 - 小更


上一篇
Day18 : Django ModelForm
下一篇
Day20 : 動態網址 - path 應用
系列文
From Django 1.11 to Django 2.1 30

尚未有邦友留言

立即登入留言