##Form介绍
我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息.。 Django form组件就实现了上面所述的功能。 #总结一下,其实form组件的主要功能如下: 1.前端渲染展示页面 获取用户输入 >>> 渲染页面 2.将数据发送给后端进行数据的合法性校验 >>> 数据校验 3.保留上次输入内容将不合法的提示信息展示给用户看 >>> 展示提示信息 #关于数据的校验 1.前端 2.后端 数据的校验前端可以没有,但是后端一定要做!!!
##forms组件能够帮你完成上面的三个过程
#1.校验数据 forms组件的校验数据的使用 1.定义一个继承forms.Form一个类 from django import forms class MyForm(forms.Form): username = forms.CharField(max_length=6) # username最长只能是6位 password = forms.CharField(max_length=8,min_length=3) # password最长8位 最短3位 email = forms.EmailField() # email接受的数据必须符合邮箱格式 2.给forms组件传参数 (字典的显示) obj = views.MyForm({'username':'egondsb','password':'12','email':'[email protected]'}) 3.查看数据是否完全合法 obj.is_valid() 4.查看所有校验通过的数据 obj.cleaned_data {'email': '[email protected]'} 5.查看所有没有通过的数据 obj.errors """ { 'username': ['Ensure this value has at most 6 characters (it has 7).'], 'password': ['Ensure this value has at least 3 characters (it has 2).']} """ #2.渲染标签 forms组件只能帮你渲染 获取用户输入(输入框 选择框 下拉框...)的标签 提交按钮也得自己写 form表单取消前端校验功能 <form action="" method="post" novalidate> forms组件当前端输入的信息不合法的时候 页面上的数据保留不会刷新 这样方便用户修改 #3.展示提示信息 {% for foo in form_obj %} <p> {{ foo.label }}{{ foo }} <span>{{ foo.errors.0 }}</span> </p> {% endfor %}
#forms组件的钩子函数
# 局部钩子 def clean_username(self): # 用户名中不能有666 username = self.cleaned_data.get('username') if '666' in username: self.add_error('username','光喊666是不行的') return username # 全局钩子 def clean(self): # 获取密码和确认密码比对 password = self.cleaned_data.get('password') confirm_password = self.cleaned_data.get('confirm_password') if not password == confirm_password: self.add_error('confirm_password','两次密码不一致') return self.cleaned_data
##普通方式手写注册功能
def register(request): back_dic = {'username':'','password':''} if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if '666' in username: back_dic['username'] = '光喊666是不行的' if password == '123': back_dic['password'] = '密码太短了 不能跟人一样' return render(request,'reg.html',locals()) # locals会将所在的名称空间中所有的名字都传递给模板页面
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Title</title> </head> <body> <form action="" method="post"> {% csrf_token %} <p>username: <input type="text" name="username"> <span>{{ back_dic.username }}</span> </p> <p>password: <input type="password" name="password"> <span>{{ back_dic.password }}</span> </p> <input type="submit"> </form> </body> </html>
##使用form组件实现注册功能