为了账号安全,请及时绑定邮箱和手机立即绑定

客户端验证 Django

客户端验证 Django

红糖糍粑 2023-10-18 22:02:48
我制作了一个扩展 UserCreationForm 的表单,我想验证客户端的输入。我怎样才能做到这一点?当我验证password1时,它工作正常,但由于某种原因,我无法检查字段是否丢失。提前致谢。class UserRegisterForm(UserCreationForm):    email = forms.EmailField()    class Meta:        model = User         fields = ['username', 'email', 'password1', 'password2']    def validate(self,password):        return self.short_enough(password) and self.has_lowercase(password) and self.has_uppercase(password) and self.has_numeric(password) and self.has_special(password)    def short_enough(self,pw):         return len(pw) == 8    def has_lowercase(self,pw):        'Password must contain a lowercase letter'        return len(set(string.ascii_lowercase).intersection(pw)) > 0    def has_uppercase(self,pw):        'Password must contain an uppercase letter'        return len(set(string.ascii_uppercase).intersection(pw)) > 0    def has_numeric(self,pw):        'Password must contain a digit'        return len(set(string.digits).intersection(pw)) > 0    def has_special(self,pw):        'Password must contain a special character'        return len(set(string.punctuation).intersection(pw)) > 0    def clean(self):                cleaned_data = super(UserRegisterForm, self).clean()        username = cleaned_data.get('username')        email = cleaned_data.get('email')        password1 = cleaned_data.get('password1')        password2 = cleaned_data.get("password2")        if username == None or email == None or password1 == None or password2 == None:                    raise forms.ValidationError("Some fields are missing" )                      if not self.validate(password1):            raise forms.ValidationError("Password must be 8 characters(1 upper, 1 lower, 1 number, 1 special character)" )        else:            return cleaned_data
查看完整描述

1 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

好的,您的模板看起来不错,只是在表单中添加了一些内容。


为了简化我添加到您定义的电子邮件字段的代码required=True,并将相同的参数设置到__init__其余字段的方法中,这将根据需要执行所有字段,您可以摆脱自定义的“空值”验证clean



class UserRegisterForm(UserCreationForm):

    email = forms.EmailField(required=True)


    class Meta:

        model = User 

        fields = ['username', 'email', 'password1', 'password2']


    def __init__(self, *args, **kwargs):

        super().__init__(*args, **kwargs)

        self.fields['username'].required = True

        self.fields['password1'].required = True

        self.fields['password2'].required = True


    def validate(self,password):


        return self.short_enough(password) and self.has_lowercase(password) and self.has_uppercase(password) and self.has_numeric(password) and self.has_special(password)



    def short_enough(self,pw):

         return len(pw) == 8


    def has_lowercase(self,pw):

        'Password must contain a lowercase letter'

        return len(set(string.ascii_lowercase).intersection(pw)) > 0


    def has_uppercase(self,pw):

        'Password must contain an uppercase letter'

        return len(set(string.ascii_uppercase).intersection(pw)) > 0


    def has_numeric(self,pw):

        'Password must contain a digit'

        return len(set(string.digits).intersection(pw)) > 0


    def has_special(self,pw):

        'Password must contain a special character'

        return len(set(string.punctuation).intersection(pw)) > 0


    def clean(self):

        cleaned_data = super(UserRegisterForm, self).clean()

        password1 = cleaned_data.get('password1')

        password2 = cleaned_data.get("password2")          


        if not self.validate(password1):

            raise forms.ValidationError("Password must be 8 characters(1 upper, 1 lower, 1 number, 1 special character)" )

        else:

            return cleaned_data

另一方面,要进行单字段验证,我建议您使用 django 提供的方法clean_<fieldname>。


查看完整回答
反对 回复 2023-10-18
  • 1 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信