【问题标题】:Django forms - cleaned_data KeyErrorDjango 表单 -cleaned_data KeyError
【发布时间】:2014-11-27 17:57:37
【问题描述】:

我有一个如下所示的表单:

class AForm(forms.ModelForm):
    email1 = forms.EmailField(required=False, initial='')
    email2 = forms.EmailField(required=False)

    class Meta:
        model = AModel
        fields = ()

    def clean_email1(self):
        return self.cleaned_data['email1'].lower()

    def clean_email2(self):
        return self.cleaned_data['email2'].lower()

    def clean(self):
        cleaned_data = super(AForm, self).clean()
        email1 = cleaned_data['email1']   # ERR
        email2 = cleaned_data['email2']
        # ...

在视图post方法中使用方式如下:

form = AForm(request.POST, instance=self.object)
if forms.is_valid():
    # ...
else:
    # ...

有时我的用户会在标有ERR 的行的clean 中生成KeyError

我不明白这怎么可能,因为as the documentation reads,cleaned_data 应该包含(作为字典键)表单的所有字段。

当我测试不发送 email1email2(或空白/空值)时,我也无法重现该错误。

我在这里错过了什么?

【问题讨论】:

  • 当我重新阅读文档时,我终于明白这意味着cleaned_data 应该包括所有的键 form.is_valid() 之后(我没有查看代码尚未关于何时准确地填充所有键)。然而,我想知道如何重现错误
  • 这是错字吗? clean_data = super(PUWForm_fwd, self).clean() 类名是AForm。
  • @JonS。对了,打错字了
  • 我遇到了这个问题,因为我错误地预期 clean() 不会在任何个人 clean_field() 调用失败时被调用。在我的例子中,raise ValidationError 表示该字段没有出现在 clean() 中的 cleaned_data 中,但我不知道验证失败,因为它通常在表单中显示为错误。

标签: python django forms


【解决方案1】:

您已将 email1 明确标记为 required=False。这意味着完全有可能在该字段没有值的情况下进行清理,在这种情况下,它不会包含在清理数据字典中。

为了防止这种情况,您可以使用普通的 dict get 方法:

email1 = cleaned_data.get('email1')

或者,当然,您可以将字段设为必填。

【讨论】:

  • 但是我在问题中提到的 django 文档的链接上写了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多