我有一个自定义表单字段(来自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)
但它仍然没有重置该字段的值。
答案 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>