2

这是一个非常简单的表格,但我不知道哪里出错了。在查看django站点的debug模式时,发现new字段的clean_data丢失了,如下图:

已清理数据 ['new'] 丢失

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']
4

1 回答 1

1

问题是如果您输入相同的新密码和旧密码,那么clean_new方法会引发异常并且不返回任何值。这就是为什么在cleaned_dataclean_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']
于 2016-12-24T18:29:23.273 回答