我在StackOverflow上读过一些关于forms.Form
vsforms.ModelForm
的文章。
当表格中已经有一个表时,最好使用ModelForm
,这样您就不必再次声明所有属性,因为它们已经存在于Mult.Py中相应的类中。
所以我的问题是
如何排除原始类的一系列属性,下面的排除表达式行吗?
class CreatePositionForm(ModelForm):
class Meta:
model = job_position
exclude = ('create_date','post_date','is_valid',)
当使用ModelForm时,是否意味着原始属性不应该更改,并且在类Meta之前不会有更多的代码?(就像上面的代码一样)
任何人都可以告诉我拥有一个表单比简单的HTML有什么好处
表单标记,但它有助于在
form.field_name.errors
我是Django的新学员,如果这些问题看起来很愚蠢,请耐心等待,非常感谢您的澄清!
最佳答案
正如django docs所说:
如果您正在构建一个数据库驱动的应用程序,那么很可能会有与Django模型非常接近的表单。例如,您可能有一个blogcoment模型,并且希望创建一个允许人们提交评论的表单。在这种情况下,在表单中定义字段类型是多余的,因为您已经在模型中定义了字段。
因此,Django提供了一个helper类,允许您从Django模型创建一个表单类。
当您需要与任何已定义模型密切相关的窗体时,ModelForm非常有用。与form.Form
类相比,ModelForm的优点是不需要编写额外的代码。例如:假设您的模型定义如下:
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
使用窗体。窗体类
使用
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')
我真的不明白你说的“抄送”是什么意思???
使用ModelForm的好处
更少的代码/无代码重复
表单验证
表格错误
快
漂亮的代码