局部钩子能防全局钩子吗_Django局部钩子和全局钩子

本文介绍了在Django中如何使用局部和全局钩子进行表单验证。局部钩子`clean_name`确保用户名以字母开头且只包含数字、字母和下划线;全局钩子`clean`则验证两个密码输入的一致性。当验证失败时,会抛出`ValidationError`并返回错误信息供前端渲染。示例代码详细展示了实现过程。
摘要由CSDN通过智能技术生成

31b2b1368a832cfdd5759468af12d899.png

Ⅰ 局部钩子的使用

  • 在自定义的Form类中写 clean_字段名
  • 取出字段的真正值
  • 做复杂判断
  • 如果判断失败,抛出ValidationError
  • 如果通过,return 判断的字段
    • 判断用户名是否以字母开头,且只能是数字字母和下划线
 from django.forms import widgets,ValidationError

   def clean_name(self):
        name = self.cleaned_data.get('name')
        if re.search('^[a-zA-Z][a-zA-Z0-9_]{2,15}$',name):
            return name
        else:
            raise ValidationError('请以字母开头,且只能是数字字母和下划线组成!')

0d0470ae333c579546f3ad560420a898.png

Ⅱ 全局钩子的使用

  • 使用方式同局部
  • 定义直接是clean(self)
    def clean(self):
        password1 = self.cleaned_data.get('password1')
        password2 = self.cleaned_data.get('password2')
        if password2 == password1:
            return self.cleaned_data
        else:
            raise ValidationError('两次密码不一致,请确认!')
  • 返回的数据不会直接渲染到html页面
  • 需要我们取出来传送到前端然后渲染
  • 校验失败后的代码
    • 做了判断,因为刚打开页面时没有数据,也会渲染出来none
        if form.is_valid():
            # 校验成功代码
            return HttpResponse('注册成功')
        else:
            err = form.errors.get('__all__')  # 取出全局钩子返回的错误信息
            if err:
                return render(request,'registered.html',{'form':form,'err':err})
            else:
                return render(request,'registered.html',{'form':form})
  • html渲染全局钩子错误信息
    • 因为这个html页面是纯手动的,用半自动的就不用加上面的判断了
       <span class="text-danger pull-right">{{ err }}</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值