玩 Django — Part 4(Model Form)

Andy Lu
7 min readMar 31, 2018

一個具有互動式輸入的網站,Form是必不可或缺的

在HTML中,一個form是被<form></form>包住的一群元素的集合,他允許使用者輸入文字,選擇項目等等...,最後再將輸入資訊傳回server。

  • Form 的架構
<form action="送出目的地" method="傳送方式">
---表單內容---
</form>

Django涉及Form的三個不同工作

  • 準備以及重組資料來將資料呈現
  • 建立HTML表單
  • 接收以及處裡送出的表單及資料從客戶端

Model Form

Django提供了一個簡便的方法來產生Form,它稱做Model Form。使用Model Form我們就可以利用簡單的幾行宣告,將我們設定的Model轉為Form的形式。

上一章的Model:

from django.db import modelsclass Coffee(models.Model):
name = models.CharField(max_length=60)
price = models.IntegerField()

寫成Model Form形式:

## forms.py ##from django.forms import ModelForm
from mycafe.models import Coffee

# Create the form class.
class CoffeeForm(ModelForm):
class Meta:
model = Coffee
fields = ['name', 'price']

建立一個ModelForm只需要在class Meta定義model以及fields(或是exclude),即可成功建立。

  • model填入對應之Model
  • fields需填入此Form要包含的欄位(Fields),或是利用exclude填入需忽略的欄位。

或是可以使用 fields= '__all__' 來指定全部的欄位都須包含。

## forms.py ##from django.forms import ModelForm
from mycafe.models import Coffee

# Create the form class.
class CoffeeForm(ModelForm):
class Meta:
model = Coffee
fields = '__all__'

底下的view將上面所定義的ModelForm呈現到畫面上。

## Views.py ##
from mycafe.forms import CoffeeForm
def newCoffee(request):
template_name = 'coffee_new.html'
form = CoffeeForm(request.POST or None)
if form.is_valid():
obj = Coffee.objects.create(
name = form.cleaned_data.get('name'),
price = form.cleaned_data.get('price')
)
return HttpResponse('OK')
return render(request, template_name, context={'form':form})

解釋:
form = CoffeeForm(request.POST or None) : 這邊判斷是HTTP GET或是 HTTP POST,若是GET則將空的form回傳,反之則將使用者輸入的資料傳給ModelForm判斷是否正確。

if form.is_valid(): ... 利用 is_valid() 可以在View中判斷使用者輸入是否正確,若不正確,則ModelForm回傳的form內就會包含錯誤訊息,我們就可以將

而Template定義如下,利用 {{ from.as_p }} 可以將輸入之form轉換成被 <p> </p> 包住的格式。

## coffee_new.html ##<!DOCTYPE html>
<html lang="en">
<body>
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="OK">
</form>

</body>
</html>

如此就可以輸入資料,將資料輸入至資料庫中。

Form 驗證(Validation)

利用上方的範例我們就可以將資料輸入至資料庫中,輸入的資料只有做基本的驗證,例如不得為空,或是型別的驗證。若要進行客製化資料內容的驗證,在Django中,也可以利用ModelForm/Form將驗證的條件寫入。

例如:

## forms.py ##from django.forms import ModelForm
from mycafe.models import Coffee

# Create the form class.
class CoffeeForm(ModelForm):
def clean_name(self):
print "clean name"
name = self.cleaned_data.get('name')
if 'TEA' in name.upper():
raise forms.ValidationError('Tea is not support')
return name
class Meta:
model = Coffee
fields = '__all__'

範例解釋:
我們需要限制在name這個欄位中,輸入的名稱需不包含Tea這個字。
我們可以在ModelForm底下定義一個function,名稱為 clean_[field_name] ,例如 clean_name ,當view呼叫is_valid()時,ModelForm中的 clean_name就會被呼叫到並判斷輸入之值是否為我們所限制的,若有包含我們不想要的字串,ModelForm就會raise forms.ValidationError('Error Message.')

def newCoffee(request):
template_name = 'coffee_new.html'
form = CoffeeForm(request.POST or None)
if form.is_valid():
obj = Coffee.objects.create(
name = form.cleaned_data.get('name'),
price = form.cleaned_data.get('price')
)
return HttpResponse('OK')
return render(request, template_name, context={'form':form})

小結

利用Django提供的Form,我們就可以任意寫出我們所需要的表單形式,以及驗證方式,再搭配CSS就可以將我們的表單樣式變得更加美觀。

--

--

Andy Lu
Andy Lu

Written by Andy Lu

Android/Flutter developer, Kotlin Expert, like to learn and share.

Responses (1)