Django cleaned_data.get('obj') 方法 returns none
Django cleaned_data.get('obj') method returns none
我正在 django 中做一些密码确认表。但我很困惑,因为 self.cleaned_data.get('confirm_password')
总是 returns none 因此我的密码永远不会相互匹配。
这是 forms.py
中的 clean
方法
def clean_password(self):
password = self.cleaned_data.get("password")
confirm_password = self.cleaned_data.get("confirm_password")
if password != confirm_password:
print(password)
print(confirm_password)
raise forms.ValidationError(
"Password and password confirmation does not match"
)
return password
self.cleaned_data.get('password')
returns 输入的密码,但 confirm_password 没有。
在view.py
看到清理前收到的数据时,confirm_password原样显示
......................user = UserRegister(request.POST)
print(request.POST.get('confirm_password'))
if user.is_valid():
print('valid')..........................
这可能是什么原因?
这是forms.py
中的表单声明部分
first_name = forms.CharField(required=True, widget=forms.widgets.TextInput(attrs={'placeholder': 'First Name'}))
last_name = forms.CharField(required=True, widget=forms.widgets.TextInput(attrs={'placeholder': 'Last Name'}))
username = forms.CharField(required=True, widget=forms.widgets.TextInput(attrs={'placeholder': 'Username'}))
email = forms.EmailField( required=True, widget=forms.widgets.EmailInput(attrs={'placeholder': 'Email'}))
password =forms.CharField(required=True, widget=forms.widgets.PasswordInput())
confirm_password =forms.CharField(required=True, widget=forms.widgets.PasswordInput())
class Meta:
model=User
fields=['first_name','last_name','username','email','password','confirm_password']
clean_fieldname
方法按字段声明的顺序调用,所以目前 clean_password
被调用 cleaned_data
不包含 confirm_password
。您可以在 clean_confirm_password
方法中执行此验证:
def clean_confirm_password(self):
password = self.cleaned_data.get("password")
confirm_password = self.cleaned_data.get("confirm_password")
if password != confirm_password:
print(password)
print(confirm_password)
raise forms.ValidationError(
"Password and password confirmation does not match"
)
return password
或者只使用 clean
方法进行需要访问多个表单字段的验证。
clean_<fieldname>()
方法在验证字段时被调用。除了您正在使用的字段之外,您不能指望当时 cleaned_data 中的任何其他字段。如果您需要使用多个字段,请覆盖表单的 clean() 方法。
由于您在多个字段之间进行验证,因此您应该重写表单的 clean
方法。
def clean(self):
cleaned_data = super().clean()
password = self.cleaned_data.get("password")
confirm_password = self.cleaned_data.get("confirm_password")
if password != confirm_password:
print(password)
print(confirm_password)
raise forms.ValidationError(
"Password and password confirmation does not match"
)
return cleaned_data
我正在 django 中做一些密码确认表。但我很困惑,因为 self.cleaned_data.get('confirm_password')
总是 returns none 因此我的密码永远不会相互匹配。
这是 forms.py
clean
方法
def clean_password(self):
password = self.cleaned_data.get("password")
confirm_password = self.cleaned_data.get("confirm_password")
if password != confirm_password:
print(password)
print(confirm_password)
raise forms.ValidationError(
"Password and password confirmation does not match"
)
return password
self.cleaned_data.get('password')
returns 输入的密码,但 confirm_password 没有。
在view.py
看到清理前收到的数据时,confirm_password原样显示
......................user = UserRegister(request.POST)
print(request.POST.get('confirm_password'))
if user.is_valid():
print('valid')..........................
这可能是什么原因?
这是forms.py
first_name = forms.CharField(required=True, widget=forms.widgets.TextInput(attrs={'placeholder': 'First Name'}))
last_name = forms.CharField(required=True, widget=forms.widgets.TextInput(attrs={'placeholder': 'Last Name'}))
username = forms.CharField(required=True, widget=forms.widgets.TextInput(attrs={'placeholder': 'Username'}))
email = forms.EmailField( required=True, widget=forms.widgets.EmailInput(attrs={'placeholder': 'Email'}))
password =forms.CharField(required=True, widget=forms.widgets.PasswordInput())
confirm_password =forms.CharField(required=True, widget=forms.widgets.PasswordInput())
class Meta:
model=User
fields=['first_name','last_name','username','email','password','confirm_password']
clean_fieldname
方法按字段声明的顺序调用,所以目前 clean_password
被调用 cleaned_data
不包含 confirm_password
。您可以在 clean_confirm_password
方法中执行此验证:
def clean_confirm_password(self):
password = self.cleaned_data.get("password")
confirm_password = self.cleaned_data.get("confirm_password")
if password != confirm_password:
print(password)
print(confirm_password)
raise forms.ValidationError(
"Password and password confirmation does not match"
)
return password
或者只使用 clean
方法进行需要访问多个表单字段的验证。
clean_<fieldname>()
方法在验证字段时被调用。除了您正在使用的字段之外,您不能指望当时 cleaned_data 中的任何其他字段。如果您需要使用多个字段,请覆盖表单的 clean() 方法。
由于您在多个字段之间进行验证,因此您应该重写表单的 clean
方法。
def clean(self):
cleaned_data = super().clean()
password = self.cleaned_data.get("password")
confirm_password = self.cleaned_data.get("confirm_password")
if password != confirm_password:
print(password)
print(confirm_password)
raise forms.ValidationError(
"Password and password confirmation does not match"
)
return cleaned_data