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

1. forms.Formforms.ModelForm的概述

Comparison between forms.Form and forms.ModelForm in Django, highlighting differences like Model Association and Data Handling

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使用案例

  1. 與模型無關的數據處理:例如:搜索表單、登錄表單、密碼重設表單。
搜索表單範例
class SearchForm(forms.Form):
    query = forms.CharField(max_length=100, label="搜索")
  1. 複雜的用戶輸入處理:例如:輸入字段不會直接存儲到模型中。
更改密碼表單範例
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使用案例

  1. 創建和更新模型對象:例如:撰寫博客文章、撰寫評論、修改用戶資料。
撰寫評論表單範例
class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['author', 'text']
  1. 基於模型的數據輸入:例如:在修改現有數據或儲存到數據庫時。

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. 要選擇哪一種表單?

  1. 與模型相關的工作:如果需要直接與數據庫互動,則適合使用forms.ModelForm
  2. 與模型無關的工作:如果需要獨立的數據驗證或用戶輸入處理,則使用forms.Form

結論

forms.Formforms.ModelForm是在Django中處理數據輸入和驗證的兩個強大工具。這兩個類別的用途和特點各不相同,因此選擇合適的表單至關重要。在下一篇文章中,我們將詳細介紹表單字段和小工具