【问题标题】:Django form.clean(), cleaned_data KeyErrorDjango form.clean(),cleaned_data KeyError
【发布时间】:2012-07-05 18:39:08
【问题描述】:

Django 1.4 documentation中,表示先运行clean_<fieldname>方法,然后再执行formclean方法。

我有以下代码示例。该表单与 FormPreview 一起使用。当表单中pmid字段为空时,应该抛出ValidationError异常,但不会发生。

class MyForm(forms.Form):
    pmid = forms.CharField()
    .. other fields ..

    def clean(self):
        cd = super(MyForm, self).clean()
        cd['pmid'] # returns KeyError and it's not in cd
        return cd

我没有覆盖任何clean_<field> 方法。

【问题讨论】:

    标签: django forms


    【解决方案1】:

    首先,如果您只想确保某个字段不为空,则只需在其中添加required=True。例如:

    class MyForm(forms.Form):
        pmid = forms.CharField(required=True)
        ...
    

    你已经完成了。

    但是,即使您不能那样做,您仍然不会在 clean 中验证它,而是在 clean_<fieldname> 中验证,如文档所述。

    def clean_pmid(self):
        pmid = self.cleaned_data.get('pmid')
        if not pmid:
            raise forms.ValidationError('pmid cannot be blank')
        return pmid
    

    【讨论】:

    • required 的默认值为 True。另外,据我所知,即使clean_<field> 没有被覆盖,它仍然会检查该字段是否为空。
    • 当您说“空”时,您的真正意思是“甚至不存在于表单中”?
    • 不,它存在于表单中,但未填写。我的问题可能与 FormPreview 有关。
    • 空/未填充/空白/等。字段仍将在cleaned_data 中有一个键。它的值只是None 或空字符串('')。如果您收到KeyError,则表示该字段随表单发布,就好像它甚至不在页面上一样。
    • 我解决了。对于 FormPreview,我使用了两个模板,而在第二个模板中,该模板没有字段。 Django 尝试从发布数据构建表单,但由于数据不可用,因此无法正确创建来自发布数据的表单。换句话说,我使用的是模板here,但没有第 19-20 行。谢谢克里斯,寻求帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2014-03-03
    • 2017-05-31
    • 2017-01-22
    • 2011-07-23
    相关资源
    最近更新 更多