form 全局钩子 中间件的五个方法 form组件
1 在定义的form类中写下面的方法: 2 #局部钩子 clean_字段名称 , 3 def clean_name(self): 4 value = self.cleaned_data['name'] 5 if '大壮' in value: 6 raise ValidationError('含有敏感词汇:大壮') 7 else: 8 return value 9 10 11 12 #全局钩子 13 def clean(self): 14 value = self.cleaned_data 15 p1 = value['password'] 16 p2 = value['r_password'] 17 if p1 == p2: 18 return value 19 else: 20 # raise ValidationError('两次输入的密码不一致!') 21 self.add_error('r_password','两次输入的密码不一致!') #给某个字段单独添加报错信息 22 raise ValidationError('两次输入的密码不一致!') 23 24 25 循环所有字段进行验证,首先完成该字段实例化的时候的属性验证min_length=6,例如:Charfield(min_length=6),然后通过反射执行该字段的局部钩子,然后进行下一次循环,完成该字段实例化的时候的属性验证min_length=6,例如:Charfield(min_length=6),然后通过反射执行该字段的局部钩子,循环结束,self.clean_data里面有各个字段的数据,然后执行全局钩子
中间件的五个方法
1 process_request(self,request) 2 process_view(self, request, view_func, view_args, view_kwargs) 3 process_template_response(self,request,response) 4 process_exception(self, request, exception) 5 process_response(self, request, response)
process_view:
process_exception:视图函数出错,会执行
process_template_response:
1 def index(request): 2 print("app01 中的 index视图") 3 #raise ValueError('出错啦') 4 def render(): 5 print("in index/render") 6 #raise ValueError('出错啦') #至于render函数中报错了,那么会先执行process_template_response方法,然后执行process_exception方法,如果是在render方法外面报错了,那么就不会执行这个process_template_response方法了。 7 return HttpResponse("O98K") #返回的将是这个新的对象 8 rep = HttpResponse("OK") 9 rep.render = render 10 return rep
1 生成页面HTML标签
2 校验用户提交的数据合法性
3 保留用户输入的数据
1 from django import forms 2 3 def mobile_validate(value): value是要被校验的数据 4 mobile_re = re.compile(r'^13[0-9]{9}') 5 if not mobile_re.match(value): 6 raise ValidationError('手机号码格式错误') #别忘了raise错误 7 8 9 class MyForm(forms.Form): 10 name = forms.CharField( 11 required=True, #默认等于True,内容不能为空 12 min_length=6, #最小长度为6 13 label='用户名', #标识 14 initial='高杰DSB', #初始值,默认值 15 # validators=[RegexValidator(r'^金瓶','没看过金梅,不能通过'),RegexValidator(r'红旭妹妹$','没看过红旭妹妹,不能通过'),], #写自定义校验规则,RegexValidator(正则,错误信息) 16 # validators=[mobile_validate,], #写自定义校验规则,RegexValidator(函数名称,) 17 help_text='这是输入用户名的地方,不能太短!', 18 error_messages={'required':'不能为空!','min_length':'太短了!'}, 19 # widget=forms.widgets.TextInput(attrs={'class':'form-control'}), 20 widget=forms.widgets.TextInput, 21 ) 22 password = forms.CharField( 23 min_length=8, 24 max_length=10, #最大长度不能超过10位 25 label='密码', 26 widget=forms.widgets.PasswordInput(), #密文输入 27 ) 28 29 radio单选框: 30 sex = forms.ChoiceField( 31 label='性别', 32 initial=3, #初始值 33 choices=((1, "男"), (2, "女"), (3, "保密")), 34 widget=forms.widgets.RadioSelect(), 35 36 ) 37 select下拉单选框 38 city = forms.ChoiceField( 39 label='性别', 40 initial=3, 41 choices=((1, "北京"), (2, "上海"), (3, "东莞")), 42 widget=forms.widgets.Select(), 43 44 ) 45 46 checkbox多选框 47 hobby = forms.MultipleChoiceField( 48 label='爱好', 49 50 choices=((1, "抽烟"), (2, "喝酒"), (3, "烫头")), 51 widget=forms.widgets.CheckboxSelectMultiple, 52 53 ) 54 55 select下拉多选框 56 girls = forms.MultipleChoiceField( 57 label='爱好', 58 59 choices=((1, "红旭妹妹"), (2, "相玺哥哥"), (3, "程根姐姐")), 60 widget=forms.widgets.SelectMultiple, 61 62 ) 63 64 单选checkbox 65 status = forms.ChoiceField( 66 label='remeber me!!', 67 68 choices=(('True', "红旭妹妹"), ('False', "相玺哥哥")), 69 widget=forms.widgets.CheckboxInput, 70 71 ) 72 73 #给标签加属性 74 widget=forms.widgets.TextInput(attrs={'class':'c1','type':'date'}),
1 def register(request): 2 form_obj = LoginForm() 3 if request.method == 'GET': 4 return render(request,'register.html',{'form_obj':form_obj}) 5 6 else: 7 # request.POST = name:'asdfasdf' 8 form_obj = LoginForm(request.POST) {‘name’:} 9 print(form_obj.fields) #拿到所有的form类中的字段 10 print(form_obj.is_valid()) 11 if form_obj.is_valid(): #校验数据 ,全部通过校验,返回True,但凡有一个不对的,就返回False 12 print(form_obj.cleaned_data) #{'name': '13812312312', 'password': '11111111'} 13 return HttpResponse('登录成功') 14 else: 15 16 print('xxxxxx') 17 print(form_obj.errors) 18 return render(request,'register.html',{'form_obj':form_obj})
html文件写法
1 {% load static %} 2 <!DOCTYPE html> 3 <html lang="zh-CN"> 4 <head> 5 <meta charset="utf-8"> 6 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 7 <meta name="viewport" content="width=device-width, initial-scale=1"> 8 <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --> 9 <title>Bootstrap 101 Template</title> 10 <!-- Bootstrap --> 11 <link href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}" rel="stylesheet"> 12 </head> 13 <body> 14 <h1>你好,世界!</h1> 15 16 <form action="" method="post" novalidate> 17 {% csrf_token %} 18 {# {{ form_obj.errors }}#} 19 {# 用户名: <input type="text" name="username"> #} 20 {# 密码: <input type="text" name="password"> #} 21 <div> 22 <label for="">{{ form_obj.name.label }}</label> 23 {{ form_obj.name }} 24 {{ form_obj.name.help_text }} 25 {# {{ form_obj.errors }}#} 26 <span style="color: red;font-size: 14px;">{{ form_obj.name.errors.0 }}</span> 27 </div> 28 <div> 29 <label for="">{{ form_obj.password.label }}</label> 30 {{ form_obj.password }} 31 {{ form_obj.password.errors.0 }} 32 {# {{ form_obj.errors }}#} 33 </div> 34 <div> 35 <label for="">{{ form_obj.r_password.label }}</label> 36 {{ form_obj.r_password }} 37 {{ form_obj.r_password.errors.0 }} 38 {# {{ form_obj.errors }}#} 39 </div> 40 {# <div>#} 41 {# <label for="">{{ form_obj.password.label }}</label>#} 42 {# {{ form_obj.password }}#} 43 {# </div>#} 44 {# <div>#} 45 {# <label for="">{{ form_obj.sex.label }}</label>#} 46 {# {{ form_obj.sex }}#} 47 {# </div>#} 48 {# <div>#} 49 {# <label for="">{{ form_obj.city.label }}</label>#} 50 {# {{ form_obj.city }}#} 51 {# </div>#} 52 {# <div>#} 53 {# <label for="">{{ form_obj.hobby.label }}</label>#} 54 {# {{ form_obj.hobby }}#} 55 {# </div>#} 56 {# <div>#} 57 {# <label for="">{{ form_obj.girls.label }}</label>#} 58 {# {{ form_obj.girls }}#} 59 {# </div>#} 60 {# <div>#} 61 {# <label for="">{{ form_obj.status.label }}</label>#} 62 {# {{ form_obj.status }}#} 63 {# </div>#} 64 65 <div> 66 <label for="">{{ form_obj.brithday.label }}</label> 67 {{ form_obj.brithday }} 68 </div> 69 70 {# {{ form_obj.as_p }}#} 71 72 <input type="submit"> 73 </form> 74 75 76 </body> 77 </html>
1 在定义的form类中写下面的方法: 2 #局部钩子 clean_字段名称 , 3 def clean_name(self): 4 value = self.cleaned_data['name'] 5 if '大壮' in value: 6 raise ValidationError('含有敏感词汇:大壮') 7 else: 8 return value 9 10 11 12 #全局钩子 13 def clean(self): 14 value = self.cleaned_data 15 p1 = value['password'] 16 p2 = value['r_password'] 17 if p1 == p2: 18 return value 19 else: 20 # raise ValidationError('两次输入的密码不一致!') 21 self.add_error('r_password','两次输入的密码不一致!') #给某个字段单独添加报错信息 22 raise ValidationError('两次输入的密码不一致!') 23 24 25 循环所有字段进行验证,首先完成该字段实例化的时候的属性验证min_length=6,例如:Charfield(min_length=6),然后通过反射执行该字段的局部钩子,然后进行下一次循环,完成该字段实例化的时候的属性验证min_length=6,例如:Charfield(min_length=6),然后通过反射执行该字段的局部钩子,循环结束,self.clean_data里面有各个字段的数据,然后执行全局钩子