Django ValueError 给定的用户名必须从表单自身在表单覆盖的保存方法上设置

Django ValueError The given username must be set from form self on form overridden save method

我在一个简单的 django 3.2.9 项目中。当我尝试覆盖我的表单保存方法时,出现下一个错误:

ValueError The given username must be set from form self

这很烦人,因为如果我不重写并从视图中调用保存功能,它工作得很好,但如果我重写方法,它似乎无法从表单中获取自身属性,尽管它可以在 class.

中的其他验证方法上执行此操作

这个,我的注册表class。

class RegisterForm(forms.Form):
    username=forms.CharField(
        required=True,
        min_length=4,max_length=50,
        widget=TextInput(attrs={
            'class':'form-control'
        })
    )
    email=forms.EmailField(
        required=True,
        min_length=4,max_length=50,
        widget=TextInput(attrs={
            'class':'form-control'
        })
    )
    pwd=forms.CharField(
        required=True,
        min_length=4,max_length=50,
        widget=PasswordInput(attrs={
            'class':'form-control'
        })
    )
    pwdr=forms.CharField(
        required=True,
        min_length=4,max_length=50,
        widget=PasswordInput(attrs={
            'class':'form-control'
        })
    )

    def clean_username(self):
        username=self.cleaned_data.get('username')
        if User.objects.filter(username=username).exists():
            raise forms.ValidationError('Ese nombre de usuario ya se encuentra en uso')
        return username

    def clean_email(self):
        email=self.cleaned_data.get('email')
        if User.objects.filter(email=email).exists():
            raise forms.ValidationError('Ese email ya se encuentra en uso')
        return email

    def clean(self):
        cleaned_data=super().clean()

        if cleaned_data.get('pwd')!= cleaned_data.get('pwdr'):
            self.add_error('pwdr','Las contraseñas no coinciden')
            return redirect('register')

        return redirect('home')

    def save(self):
        username=self.cleaned_data.get('username')
        email=self.cleaned_data.get('email')
        pwd=self.cleaned_data.get('pwd')
        
        return User.objects.create_user(
            username,
            email,
            pwd
        )

保存方法中来自 print(self) 的自内容

label for="id_username">Username:<input

type="text" name="username" value="vidalon" class="form-control" maxlength="50" minlength="4" required id="id_username">

Email: Pwd: Pwdr:

---更新--- 我从 django docs

得到这个

我们可以在哪里阅读以下内容:

请注意,Form.add_error() 会自动删除相关字段 来自 cleaned_data.

所以基本上我对两个密码字段和一个表单 class 进行了验证,使用干净的方法来验证这两个相关字段,如下所示:

def clean(self):
        cleaned_data=super().clean()

        if cleaned_data.get('pwd')!= cleaned_data.get('pwdr'):
            self.add_error('pwdr','Passwords doesn´t match')
            return redirect('register')

        return redirect('home')

所以我想问题已经解决了,现在继续编码是有意义的! 感谢关注

我从 django docs

那里得到了这个

我们可以在哪里阅读以下内容:

请注意 Form.add_error() 会自动从 cleaned_data 中删除相关字段。