Django 中的 Form
和 ModelForm
都用于处理表单,但它们有显著的区别。下面通过表格以及示例进行说明。
特性 | Form | ModelForm |
---|---|---|
定义方式 | 手动定义所有字段。 | 自动生成字段,基于与模型(Model)的对应关系。 |
字段与模型的关联 | 不与数据库模型(Model)相关。 | 直接与数据库模型相关,字段映射到模型的字段。 |
使用场景 | 自定义表单,不需要与数据库模型交互的场景。 | 当需要基于数据库模型创建或更新记录时使用。 |
表单验证 | 需要手动定义字段验证规则。 | 自动继承模型中的字段验证规则,可以自定义额外规则。 |
表单保存 | 需要手动编写保存逻辑。 | 提供 save() 方法,直接保存到数据库。 |
代码量 | 需要手动定义字段、验证和保存逻辑,代码量较多。 | 自动生成字段,代码量较少,尤其在处理复杂模型时。 |
Form
示例Form
通常用于不需要直接与模型交互的场景,比如用户反馈表单。
pythonfrom django import forms
class ContactForm(forms.Form):
name = forms.CharField(max_length=100)
email = forms.EmailField()
message = forms.CharField(widget=forms.Textarea)
# 自定义验证规则
def clean_name(self):
name = self.cleaned_data.get('name')
if 'spam' in name:
raise forms.ValidationError('Invalid name')
return name
ModelForm
示例ModelForm
用于基于模型生成表单,比如用户注册表单。
pythonfrom django import forms
from .models import UserProfile
class UserProfileForm(forms.ModelForm):
class Meta:
model = UserProfile # 绑定的模型
fields = ['username', 'email', 'bio'] # 自动生成这些字段
# 可以自定义字段验证
def clean_email(self):
email = self.cleaned_data.get('email')
if not email.endswith('@example.com'):
raise forms.ValidationError('Please use a valid example.com email')
return email
Form
用于手动定义表单,适用于任何需要自定义表单的场景。ModelForm
自动生成表单,适合需要与数据库模型交互的场景。本文作者:GYC
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!