- 準備以及重組資料來將資料呈現
- 建立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 CoffeeFormdef 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就可以將我們的表單樣式變得更加美觀。
Ref: Form and field validation
Ref: ModelForm