利用forms表单组件进行表单校验,完成用户名,密码,确认密码,邮箱功能的校验
该作业包含了下面的知识点:
error_messages,label,required,invalid,局部钩子函数,全局钩子函数,
forms_obj.cleaned_data,forms_obj.errors,locals(),
{{ forms.label }}:{{ forms }},{{ forms.errors.0 }}
urls.py文件
添加index访问路径 from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^register/', views.register), url(r'^index/', views.index), ]
views.py文件
创建视图函数
#***************************forms组件************************ # 使用forms组件,完成数据校验,展示错误信息 # 使用forms组件的前提是,你需要提前写一个类 from django import forms from django.core.validators import RegexValidator class MyForm(forms.Form): # username字段,最少三位,最多八位 username = forms.CharField(max_length=8, min_length=3, label='用户名', error_messages={ 'max_length': '用户名最长八位', 'min_length': '用户名最少三位', 'required': '用户名不能为空', } ) # password字段,最少三位,最多八位 password = forms.CharField(max_length=8, min_length=3, label='密码', error_messages={ 'max_length': '密码最多8位', 'min_length': '密码最少3位', 'required': '密码不能为空' } ) confirm_password = forms.CharField(max_length=8, min_length=3, label='确认密码', error_messages={ 'max_length': '确认密码最多8位', 'min_length': '确认密码最少3位', 'required': '确认密码不能为空' } ) # email字段,必须是邮箱格式 email = forms.EmailField(label='邮箱', error_messages={ 'required': '邮箱不能为空', # required,校验不能为空的固定用法 'invalid': '邮箱格式错误', # invalid,专门用来校验邮箱格式错误的固定用法 }) #******************************************************************************** #校验用户名中不能含有666,校验单个字段使用局部钩子函数, #钩子函数是校验规则中最后执行的一道关卡,会先执行上面的校验规则,上面都校验通过了, # 才会走到钩子函数这一层的校验来。 def clean_username(self): # username=self.cleaned_data #是一个校验通过的大字典 # 通过的字典支持点get取值的方式,专门拿出来要校验的字段 username=self.cleaned_data.get('username') if '666' in username: #如何给username所对应的框展示错误信息呢? #注意下面是钩子函数的固定用法,添加对应字段的错误提示信息 self.add_error('username','光喊666是不行的') #将username数据返回,这个地方是必须要返回字段数据的,缺失不可 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 ''' 1.label='xxx'是对应的input输入框前面的提示文字 2.error_messages={ 'max_length':'密码最多8位', 'min_length':'密码最少3位', 'required':'密码不能为空' } 这个是固定格式,必填项必须用required也是固定的用法 3.required,校验不能为空的固定用法 4.invalid,专门用来校验邮箱格式错误的固定用法 ''' def index(request): ''' 渲染标签: 第一步,需要生成一个空的forms_obj,MyForm类的对象 第二步,通过locals()和render方法渲染到前端index页面 ''' forms_obj = MyForm() # 后端如何校验前端用户传入的数据 if request.method == 'POST': # 获取用户的数据,request.POST正好是一个字典, # request.POST作为该类的参数传入MyForm()类中, # 然后再交给Forms组件来校验数据 # 注意事项,这两个forms_obj对象必须要书写一致 forms_obj = MyForm(request.POST) if forms_obj.is_valid(): print(forms_obj.cleaned_data) # 打印成功的数据 return HttpResponse('数据全部OK') else: print(forms_obj.errors) # 打印错误的数据 return render(request, 'index.html', locals()) ''' 获取用户的数据 request.POST正好是一个字典 检验数据神6条中的第二条: 2.给写好的类,传字典数据(代校验的数据,生成一个代校验对象) form_obj=views.MyForm({'username':'jason','password':123,'email':'123@'}) ''' # print(type(forms_obj)) # print('我是',forms_obj) # for forms in forms_obj: # print('我是',forms) ''' forms 相关打印结果: 我是 < input type = "text" name = "username" maxlength = "8" minlength = "3" required id = "id_username" / > ''' # 直接将生成的对象,传递给前端页面 #return render(request, 'index.html', locals())
index.html文件
<form action="" method="post" novalidate> {% for forms in forms_obj %} <p> {{ forms.label }}:{{ forms }} <span>{{ forms.errors.0 }}</span> </p> {# <span>{{ forms.label }}</span> #} {# <span>{{ forms }}</span>#} {# {{ forms.label }}是标签前面的注释,举例:input输入框前面的用户名,密码,年龄这些文字提示 #} {# {{ forms }} 是表单中所有的输入框 #} {# {{ forms.errors.0 }} 是固定用法,获取表单提交中的错误字段详细信息,咱后端或者前端页面都可以查看 #} {% endfor %} <input type="submit"> </form>