2016-12-24 37 views
2

这是一个非常简单的表单,但我不知道哪里出了问题。当我检查的Django站点的调试模式下,我发现new场clean_data丢失,如下的画面:form.cleaned_data在表单处理时

cleaned_data['new'] is missing

class PasswordEditForm(forms.Form): 
    old = forms.CharField(widget=forms.PasswordInput, min_length=6, 
         max_length=30, label='舊密碼', label_suffix=' ') 
    new = forms.CharField(widget=forms.PasswordInput, min_length=6, 
         max_length=30, label='新密碼', label_suffix=' ') 
    new_confirm = forms.CharField(widget=forms.PasswordInput, min_length=6, 
           max_length=30, label='再輸入一次', label_suffix=' ') 

    def clean_new(self): 
    cd = self.cleaned_data 
    if cd['old'] == cd['new']: 
     raise forms.ValidationError('新密碼與舊密碼相同') 
    return cd['new'] 

    def clean_new_confirm(self): 
    cd = self.cleaned_data 
    if cd['new'] != cd['new_confirm']: 
     raise forms.ValidationError('兩次輸入密碼不相符') 
    return cd['new_confirm'] 

回答

1

的问题是,如果你键入同样的新的和旧的密码然后clean_new方法引发异常并返回没有值。这就是为什么在clean_new_confirm之后执行的clean_new之后的清空数据不包含new的值。

只需使用get即可避免错误。首先检查是否cleaned_data包含new值,如果是,检查是否new等于new_confirm

def clean_new_confirm(self): 
    cd = self.cleaned_data 
    new_pass = cd.get('new') 
    if new_pass and new_pass != cd.get('new_confirm'): 
     raise forms.ValidationError('兩次輸入密碼不相符') 
    return cd['new_confirm'] 
+0

@JianWei你是非常欢迎的。 – neverwalkaloner