Django4.0 使用表单-详解Django Form类
所有表单类都作为 django.forms.Form
或者 django.forms.ModelForm
的子类来创建。您可以把 ModelForm
想象成 Form
的子类。实际上 Form
和 ModelForm
从(私有) BaseForm
类继承了通用功能,但是这个实现细节不怎么重要。
模型和表单
实际上,如果您的表单是要直接用来添加或编辑Django模型,用 ModelForm
,可以省时、省力、省代码,因为它会根据 Model 类构建一张对应字段及其属性的表单。
绑定的和未绑定的表单实例
未绑定的表单没有与其关联的数据。当渲染给用户的时候,它会是空的或者包含默认值。
绑定的表单拥有已提交的数据,因此可以用来判断数据是否合法。如果渲染了一张非法的绑定的表单,它将包含内联的错误信息,告知用户要纠正哪些数据。
表单的 is_bound
属性将告诉您一张表单是否具有绑定的数据。
字段详解
考虑一下比我们上面的小示例更有用的一张表单,我们可以用它在个人网站上实现“联系我”的功能:
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField(widget=forms.Textarea)
sender = forms.EmailField()
cc_myself = forms.BooleanField(required=False)
我们之前的表单只用了一个 CharField
类型的字段 your_name
。在这个例子中,我们的表单有四个字段: subject
、 message
、 sender
和 cc_myself
。只用到三种可用的字段类型: CharField
、 EmailField
和 BooleanField
。
控件
每个表单字段都有一个相对应的 控件类 ,这个控件类又有对应的HTML表单控件,比如 <input type="text">
。
多数情况下,字段都有合适的默认控件。比如,默认情况下, CharField
有个 TextInput
控件,它会在HTML中生成一个 <input type="text">
。如果您想要的是 <textarea>
,您要在定义表单字段的时候指定控件,就像我们对 message
字段那样处理。
字段数据
无论用表单提交了什么数据,一旦通过调用 is_valid()
验证成功( is_valid()
返回 True
),已验证的表单数据将被放到 form.cleaned_data
字典中。这里的数据已经很好的为你转化为Python类型。
注解:此时您依然能够直接从 request.POST
中访问到未验证的数据,但最好还是使用经验证的数据。
在上面的联系表单示例中, cc_myself
会被转化成一个布尔值。同样的,字段 IntegerField
和 FloatField
的值分别会被转化为Python的 int
和 float
类型。
下面例举了如何在视图中处理表单数据:
from django.core.mail import send_mail
if form.is_valid():
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
sender = form.cleaned_data['sender']
cc_myself = form.cleaned_data['cc_myself']
recipients = ['info@example.com']
if cc_myself:
recipients.append(sender)
send_mail(subject, message, sender, recipients)
return HttpResponseRedirect('/thanks/')
有些字段类型需要一些额外的处理。例如,使用表单上传文件就要以不同的方式处理(它们可以从 request.FILES
获取,而不是 request.POST
中)。