Django中提供了兩個主要的表單類別:forms.Form
和forms.ModelForm
。在這篇文章中,我們將通過這兩個類別的差異及各自的使用案例,說明在什麼情況下應該選擇哪一種表單。
1. forms.Form
與forms.ModelForm
的概述

1.1 forms.Form
是什麼?
- 獨立的表單類別:不依賴於Django模型,可以手動定義所需的數據。
- 主要用途:用於接收用戶輸入並進行簡單的驗證,或處理與模型沒有直接關聯的數據。
範例:用戶反饋表單
from django import forms
class FeedbackForm(forms.Form):
name = forms.CharField(max_length=50, label="您的名字")
email = forms.EmailField(label="您的電子郵件")
message = forms.CharField(widget=forms.Textarea, label="您的反饋")
1.2 forms.ModelForm
是什麼?
- 與模型連接的表單類別:與Django模型直接相關,自動化與數據庫的互動。
- 主要用途:用於創建或更新模型實例,或接收要存儲到數據庫的數據。
範例:博客文章撰寫表單
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'content']
2. 主要差異比較
分類 | forms.Form | forms.ModelForm |
---|---|---|
與模型的關聯 | 與模型無關 | 與模型直接相關 |
數據處理 | 在數據驗證後手動保存 | 數據自動保存(使用form.save() 方法) |
字段定義方式 | 所有字段顯式定義 | 自動將模型的字段轉換為表單字段 |
使用用途 | 獨立的數據處理或用戶輸入表單 | 與數據庫操作相關的表單 |
靈活性 | 可以自由組合字段 | 依賴於模型字段 |
3. 使用案例
3.1 forms.Form
使用案例
- 與模型無關的數據處理:例如:搜索表單、登錄表單、密碼重設表單。
搜索表單範例
class SearchForm(forms.Form):
query = forms.CharField(max_length=100, label="搜索")
- 複雜的用戶輸入處理:例如:輸入字段不會直接存儲到模型中。
更改密碼表單範例
class PasswordChangeForm(forms.Form):
old_password = forms.CharField(widget=forms.PasswordInput, label="舊密碼")
new_password = forms.CharField(widget=forms.PasswordInput, label="新密碼")
confirm_password = forms.CharField(widget=forms.PasswordInput, label="確認密碼")
def clean(self):
cleaned_data = super().clean()
new_password = cleaned_data.get("new_password")
confirm_password = cleaned_data.get("confirm_password")
if new_password != confirm_password:
raise forms.ValidationError("密碼不匹配。")
3.2 forms.ModelForm
使用案例
- 創建和更新模型對象:例如:撰寫博客文章、撰寫評論、修改用戶資料。
撰寫評論表單範例
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ['author', 'text']
- 基於模型的數據輸入:例如:在修改現有數據或儲存到數據庫時。
4. 表單運作方式比較
4.1 數據驗證
forms.Form
:手動定義字段和驗證邏輯。forms.ModelForm
:自動使用模型字段中定義的驗證規則。
範例:模型字段驗證
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ['name', 'price']
price
字段自動驗證模型中定義的約束(max_digits
,decimal_places
)。
4.2 數據存儲
forms.Form
:使用cleaned_data
來處理數據。forms.ModelForm
:通過save()
方法自動保存數據。
forms.Form
數據存儲範例
form = FeedbackForm(request.POST)
if form.is_valid():
feedback = Feedback(
name=form.cleaned_data['name'],
email=form.cleaned_data['email'],
message=form.cleaned_data['message']
)
feedback.save()
forms.ModelForm
數據存儲範例
form = PostForm(request.POST)
if form.is_valid():
form.save()
5. 要選擇哪一種表單?
- 與模型相關的工作:如果需要直接與數據庫互動,則適合使用
forms.ModelForm
。 - 與模型無關的工作:如果需要獨立的數據驗證或用戶輸入處理,則使用
forms.Form
。
結論
forms.Form
和forms.ModelForm
是在Django中處理數據輸入和驗證的兩個強大工具。這兩個類別的用途和特點各不相同,因此選擇合適的表單至關重要。在下一篇文章中,我們將詳細介紹表單字段和小工具。
Add a New Comment