在出现 ValidationError 时重置字段值

Reset field value in case of a ValidationError

我有一个自定义表单域(子class编辑自CharField)。底层模型有一个 is_approved() 方法。现在,如果该字段已获批准 (is_approved() returns True),我将提高 ValidationError 并将该字段呈现为只读。这里的缺点是 HTML 字段有一个我输入的值(由于 ValidationError 无法保存)并且甚至无法更改它,因为 HTML 字段是只读的。

有没有办法将字段的值更改为原来的值,这样我的表单就不会报错了?在字段的 validate() 方法中设置 self.initial 没有帮助。

Update:在试验了形式 class 之后,我实现了以下 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)

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

我找到了解决办法,在字段的to_python()方法中设置self.was_approved

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() 的 return 值:

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

使用这种方法,我什至可以删除问题中提到的 clean() 方法,并获得与预期完全相同的结果:我收到验证错误,而呈现的表单已经显示了数据库值.