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 中删除相关字段。
我在一个简单的 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 中删除相关字段。