简体   繁体   中英

'super' object has no attribute 'clean_password1'

I'm trying to reuse a code for registration form from my older project. The problem is that Django says that UserCreationForm hasn't attribute clean_password1 .

Do you know where is the problem? I see that there is not such attribute in UserCreationForm but it worked before.

What should I do to make it work?

EDIT: It's because it calls super(...).clean_password1 which isn't in super class. So I've tried to put there super(...).cleaned_data.get("password1"), but it raises error that cleaned_data isn't there (in superclass).

class UserProfileCreationForm(UserCreationForm):
    username = forms.CharField(label="Username", max_length=40, min_length=5)
    email = forms.EmailField(label="Email address", max_length=40)
    first_name = forms.CharField(label='First name', max_length=40, required=False)
    last_name = forms.CharField(label='Last name', max_length=40, required=False)

    password1 = forms.CharField(label="Password", widget=forms.PasswordInput, min_length=5)
    password2 = forms.CharField(label="Password confirmation", widget=forms.PasswordInput)

    class Meta():
        model = UserProfile
        fields = (
            'username', 'email', 'type_of_user', 'first_name', 'last_name', 'password1', 'password2','IBAN',

        )

    def clean_password1(self):
        password = self.cleaned_data.get('password1')
        if len(password) < 8:
            raise ValidationError('Password has to be of size at least 8 characters')
        return super(UserProfileCreationForm, self).clean_password1()

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Password mismatch")
        return password2

    def save(self, commit=True):
        try:
            with transaction.atomic():
                user = User(username=self.cleaned_data['username'],
                            first_name=self.cleaned_data['first_name'],
                            last_name=self.cleaned_data['last_name'],
                            email=self.cleaned_data['email'])
                user.save()
                user.set_password(self.cleaned_data["password1"])

                user_profile = UserProfile(user=user,
                                           IBAN=self.cleaned_data['IBAN'],
                                           type_of_user=self.cleaned_data['type_of_user']
                                           )
                user_profile.save()
        except:
            raise #TODO: HANDLE THE EXCEPTION

        return user

You can safely remove clean_password2 - Django already validates if the passwords match (I assume you're using the current version for your new project). As for clean_password1 I'd recommend to remove it too and read documentation on password validation (new in Django 1.9).

There's no reason to call super inside a clean_field method; the field doesn't exist on the base class, so neither does the clean_field.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM