clean_username函数验证失败

clean_username函数验证失败

问题描述:

https://img1.sycdn.imooc.com/climg/665fc73709febdc207890337.jpg

https://img1.sycdn.imooc.com/climg/665fc7470949f89308440377.jpg

https://img1.sycdn.imooc.com/climg/665fc7560971ad3e09510398.jpg


相关代码:

https://img1.sycdn.imooc.com/climg/665fc77a09b9afde11820411.jpg

https://img1.sycdn.imooc.com/climg/665fc79209cd228011820491.jpg

form表单

class LoginForm(forms.Form):
    '''登录表单'''
    username = forms.CharField(label='用户名', max_length=100,
                               required=False,
                               help_text='帮助文字',
                               initial='admin')
    password = forms.CharField(label='密码', max_length=200,
                               min_length=6,
                               widget=forms.PasswordInput)

    def clean_username(self):
        '''验证用户名hook钩子函数'''
        username = self.cleaned_data['username']
        pattern = r'^1[0-9]{10}$'
        if not re.search(pattern, username):
            raise forms.ValidationError('请输入手机号码',
                                        code='invalid_username',
                                        params=(username, ))
        return username

    @transaction.atomic
    def save(self, commit=False):
        # 得到模型的对象,commit=False,并灭有提交到数据
        user_obj = super().save(commit)
        # 此处还可以进行一些业务逻辑处理
        user_obj.save()
        # 对其他模型的一个操作
        UserProfile.objects.create(user=user_obj, username=user_obj.username)
        return user_obj

    def clean(self):
        data = super().clean()
        print(data)
        if self.errors:
            return

        # username = data['username']
        # password = data['password']
        username = data.get('username', None)
        password = data.get('password', None)

        if username and password:
            # 查询用户名和密码匹配的用户
            user_list = User.objects.filter(username=username)
            err_list = []
            if user_list.count == 0:
                # raise forms.ValidationError('用户名不存在')
                err_list.append(forms.ValidationError('用户名不存在'))
            # 验证密码是否正确
            if not user_list.filter(password=password).exists():
                # raise forms.ValidationError('密码不正确')
                err_list.append(forms.ValidationError('密码不正确'))
            if err_list:
                raise forms.ValidationError(err_list)


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学,你好!表单提交是post 方法,如果是post 方法,再判断否接收成功表单。如果不是post方法那就是get 方法,get方法是接不到表单值的。同学当前是get 方法的操作。所以同学需要用if 判断下是不是post 方法,post方法中继续判断接收成功与接收失败的操作。修改如下:

https://img1.sycdn.imooc.com/climg/665ff14b09f90d8205110356.jpg

2、自定义clean_username方法时,raise 表单错误的参数过多,会造成报错的。同学只传个报错提示就可以的

https://img1.sycdn.imooc.com/climg/665ff22b0942acc009620244.jpg

祝学习愉快~

  • 曲别针010 提问者 #1

    按照老师说的这两点修改后,确实能解决问题,但还有两点需要老师解答:

    1、

    https://img1.sycdn.imooc.com/climg/66600ed1098eb20415180901.jpg


    2、如下参数,我是想验证2-3课堂上将的这个功能,将username的值显示出来,如果去掉后就无法验证了

    https://img1.sycdn.imooc.com/climg/66600d4f09d102ab09810844.jpg

    2024-06-05 15:09:02
  • 好帮手慕小猿 回复 提问者 曲别针010 #2

    同学,你好!1、同学的代码和老师的代码是不一样的,老师的代码有if语句, 判断是post 还是get 方法。当同学提交表单时是post方法,不写if 是post 还是get 方法,可以理解为是get方法。不执行方法中的语句,所以表单提交不成功。

    2、同学在第一个参数中加上%s就可以将username 的值替换到%s的位置

    https://img1.sycdn.imooc.com/climg/666022460949cd6a05270090.jpg

    祝学习愉快~

    2024-06-05 16:31:20
  • 曲别针010 提问者 回复 好帮手慕小猿 #3

    好的,我自己实验理解了下:

    is_valid是针对携带了POST数据的表单(form=loginForm(reques.POST)),

    而针对没有携带POST数据的表单(form=loginForm())是不做验证的


    2024-06-05 17:35:10
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师