DJango作为一个无比强大的开发框架,自身所带的强大功能基本能满足我们的开发需求,今天我们就来研究一下django的Form表单。
django的Form表单为我们提供了许多便利,它可以渲染模板中的表单,可以对表单中的数据进行渲染,还可以实现在刷新页面的情况下不丢失表单数据,设想你要填写10个表单,其中一个填写错误,提交之后返回给你没有数据的表单页面让你重新填写是不是脑瓜疼,Form就可以实现刷新网页而不丢失数据,堪比ajax。
既然要把表单渲染到模板中,就需要先创建表单。form创建表单可以继承models里的字段,即继承数据库中的字段进行创建,也可以自定义表单。通常自定义表单更加的灵活,但有一个缺点就是无法直接验证数据库中对字段的限制条件,需要我们自定义函数进行验证。我使用自定义form表单。
首先导入一些模块
from django import forms # 导入forms模块,所有的表单都要继承这个类
from .models import * # 导入models模块中的表单,自定义验证时需要使用其连接数据库
from django.forms import widgets as wds # 自定义表单属性的插件
from django.forms import fields #定义表单字段的模块
from django.core.exceptions import ValidationError #用于自定义表单错误信息
from django.core.validators import RegexValidator #正则验证
import hashlib # 对密码进行md5加密的方法
先生成注册界面的表单:
class RegisterForm(forms.Form):
username = fields.CharField(label="用户名",strip=False,max_length=12,min_length=2,
error_messages={
"max_length":"用户名不能超过12位",
"min_length":"用户名不能低于两位",
"required":"用户名不能为空"
},
validators=[RegexValidator(
regex=r'^[\u4E00-\u9FA5A-Za-z0-9_]+$',
message="用户名只能由汉字,数字,字母,下划线组成",
)],
)
gender = fields.ChoiceField(label="性别",required=False,
choices=(
("男","男"),
("女","女")
),
widget=wds.RadioSelect(),
)
password1 = fields.CharField(label="密码",strip=False,max_length=20,min_length=8,widget=forms.PasswordInput,
error_messages={
"max_length":"密码不能超过20位",
"min_length":"密码不能低于8位",
"required":"密码不能为空"
}
)
password2 = fields.CharField(label="确认密码",widget=forms.PasswordInput,
error_messages={
"required":""
}
)
answer = fields.CharField(label="答案",max_length=50,
help_text ="可用于找回密码或修改密码",
error_messages={
"max_length": "答案太长了",
"required": "答案不能为空"
}
)
fileds中用到的参数的参数
max_length:最大长度
min_length:最小长度
strip:是否有空格
error_messages:返回前端的错误信息
validators:验证规则
widget:定义表单样式
help_text:帮助信息
接下来就需要把定义好的表单渲染到模板中,只需要一行:
from .form import * #导入form中的表单类
def register(req):
print(req.method)
if req.method == "GET":
form = RegisterForm() #实例化表单类
return render(req,"register_login.html",locals())
前端的渲染:
在页面中显示:
这样我们就可以进行基本的验证了。
比如什么都不填写点击注册时:
当我们在信息填写错误提交后,在刷新页面以填写的数据并不会丢失(除密码外):
但是这些功能使用js也可以实现,而且可以实现的更好,那么我们为什么要使用form编写呢。试想我们想要判断用户名是否已经存在,这个时候就需要去数据库查找了, 这个时候form的作用就凸现出来了,我们可以在form中自定义验证。
form为我们预留了三个form自定义验证方法:
- def cleane_字段名():单个字段验证,只要该字段验证通过就会执行该自定义验证函数,若验证通过可以pass或者返回字段值,错误可以使用ValidationError 返回错误。
- def cleaned():对所有字段进行验证,任何一个字段验证通过都会执行该自定义验证函数,若验证通过pass或者返回接收到的字段值,错误可以使用ValidationError 返回错误。
- def _post_cleand():对所有字段进行验证,若验证通过pass或者返回接收到的字段值,错误进行add_error。
以上是三种方法都可以对接收到的字段进行修改后返回,我们使用的是第一种。
代码如下:
def clean_password2(self):
if not self.errors.get("password1"): # 如果password1字段没有出现错误执行密码一致性判断
if self.cleaned_data["password2"] != self.cleaned_data["password1"]:
raise ValidationError("您输入的密码不一致,请重新输入")
return self.cleaned_data
def clean_username(self):
if UserInfo.objects.filter(username=self.cleaned_data["username"]):
raise ValidationError("您输入的用户名已存在")
else:
return self.cleaned_data["username"]
验证如下:
这样我们就完成了一个完整注册校验。