Django4 中文入门教程 Django4.0 使用表单-详解Django Form类

2024-02-25 开发教程 Django4 中文入门教程 匿名 6

所有表单类都作为 ​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​ 中)。