在ValidationError的情况下重置字段值

时间:2015-05-15 08:32:25

标签: django django-forms

我有一个自定义表单字段(来自CharField的子类)。基础模型具有is_approved()方法。现在,如果该字段已被批准(is_approved()返回True),我会引发ValidationError并将该字段呈现为只读。这里的缺点是HTML字段有一个我输入的值(由于ValidationError而无法保存),甚至无法更改它,因为HTML字段是只读的。

有没有办法将字段的值更改为原始值,所以我的表单不会抱怨?在字段的self.initial方法中设置validate()没有帮助。

更新:在尝试使用表单类之后,我实现了以下clean()方法:

def clean(self, *args, **kwargs):
    for field_id, e in self.errors.items():
        needs_reset = False

        for error in e.as_data():
            if error.code == 'field_approved':
                needs_reset = True

        if needs_reset:
            self.cleaned_data[field_id] = self.fields[field_id].field.value

    super(BuildFillForm, self).clean(*args, **kwargs)

但它仍然没有重置该字段的值。

1 个答案:

答案 0 :(得分:0)

我通过在字段self.was_approved方法中设置to_python()找到了解决方案:

def to_python(self, value):
    old_value = self.dbfield.value

    if (
            self.dbfield.is_approved() and
            old_value != value):
        self.was_approved = True

    return '' if value is None else value

然后使用此was_approved属性更改bound_data()的返回值:

def bound_data(self, data, initial):
    if self.was_approved:
        return initial
    else:
        return data

使用这种方法,我甚至可以删除问题中提到的clean()方法,并获得完全相同的结果:我得到验证错误,而渲染的表单已经显示了数据库值。 / p>