在出现 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()
方法,并获得与预期完全相同的结果:我收到验证错误,而呈现的表单已经显示了数据库值.
我有一个自定义表单域(子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()
方法,并获得与预期完全相同的结果:我收到验证错误,而呈现的表单已经显示了数据库值.