正如 django 文档所述:
如果您正在构建一个数据库驱动的应用程序,那么您很可能拥有与 Django 模型紧密映射的表单。例如,您可能有一个 BlogComment 模型,并且您想创建一个允许人们提交评论的表单。在这种情况下,在表单中定义字段类型是多余的,因为您已经在模型中定义了字段。
出于这个原因,Django 提供了一个帮助类,让您可以从 Django 模型创建一个 Form 类。
当您需要与任何已定义模型密切相关的表单时,ModelForm 非常有用。ModelForm 相对于form.Form
类的优点是您不需要编写额外的代码。例如:假设您有一个定义如下的模型:
class Profile(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
email = models.EmailField()
phone = models.IntegerField()
profile_summary = models.TextField()
# .. some more fields ..
现在让我们使用 3 种不同的方法创建一个表单,看看哪一种最容易实现。
简单的 HTML 表单
对于纯 HTML 表单,您需要在模板中实现表单元素,然后自己验证数据,如下所示。
<form id="profile-form">
<div>
<label>First Name</label>
<input name="first_name" type="text" />
</div>
<div>
<label>Last Name</label>
<input name="last_name" type="text" />
</div>
<div>
<label>Email</label>
<input name="email" type="text" />
</div>
<div>
<label>Phone Number</label>
<input name="phone" type="text" />
</div>
<div>
<label>Profile Summary</label>
<textarea name="profile_summary"></textarea>
</div>
</form>
然后在视图中:
def update_profile(request):
if request.method == 'POST'
first_name = request.POST.get('first_name')
# Do this for all the fields and validate them
# manually
使用 forms.Form 类
使用django.forms.Form
该类,您可以定义如下形式
from django import forms
class ProfileForm(forms.Form):
first_name = forms.CharField()
last_name = forms.CharField()
email = forms.EmailField()
phone = forms.IntegerField()
summary = forms.TextField()
# Notice the code duplication here
# we already have this defined in our models.
使用 ModelForm 类
from django import forms
class ProfileForm(forms.ModelForm)
class Meta:
model = models.Profile
因此,使用ModelForm
类您可以在 4-5 行代码内简单地创建表单,并让 django 为您进行验证并显示表单错误。
现在回答你的问题,
- 有两种方法可以从表单类中排除特定字段。您可以使用
exclude
或定义fields
.
排除
from django import forms
class ProfileForm(forms.ModelForm)
class Meta:
model = models.Profile
exclude = ('phone',)
字段
from django import forms
class ProfileForm(forms.ModelForm)
class Meta:
model = models.Profile
fields = ('first_name', 'last_name', 'email', 'profile_summary')
我真的不明白你的意思是什么original attributes are not supposed to be changed
???
使用 ModelForm 的好处
- 更少的代码/没有代码重复
- 表单验证
- 表单错误
- 快的
- 漂亮的代码