【发布时间】:2016-07-05 14:26:44
【问题描述】:
我已经实现了一个自定义表单字段,用于将代表米单位的模型整数字段转换为代表公里单位的表单浮点字段。 即在我的模型整数字段中保存的 3500 米将在表单浮点字段中显示 3,5,并且当发送表单时,它需要转换回整数。为了实现这一点,我在显示之前将值除以 1000,并在保存时将其乘以 1000。
渲染部分工作正常(在小部件渲染中除以 1000,或者更确切地说是表单字段中的 prepare_value)。
当表单抛出错误并且需要重新显示值时,问题就出现了。在这种情况下,表单值将被传递给它(即浮点数 3,5)并且该值被重新划分并显示为 0,0035。所以我不需要再将值除以 1000。
class KmInput(NumberInput):
def render(self, name, value, attrs=None):
try:
value = str(float(value or 0) / 1000)
except ValueError:
pass
return super(KmInput, self).render(name, value, attrs)
class MeterToKmField(forms.FloatField):
widget = KmInput
def __init__(self, max_value=None, *args, **kwargs):
super(MeterToKmField, self).__init__(max_value, 0, *args, **kwargs)
def to_python(self, value):
result = super(MeterToKmField, self).to_python(value)
value *= 1000
return result
class DistanceForm(forms.ModelForm):
distance = MeterToKmField(help_text="km")
class Meta:
model = Distance
我错过了什么吗?
更新:
正如Peter DeGlopper 所建议的那样,我已经在我的自定义小部件中实现了 _format_value,但是当表单引发错误时,我仍然会调用此方法,使已经除以 1000 的值再次被除.. 这是我所做的:
class KmInput(NumberInput):
def _format_value(self, value):
try:
return str(float(value or 0) / 1000)
except ValueError:
return value
class MeterToKmField(forms.FloatField):
widget = KmInput
def __init__(self, max_value=None, *args, **kwargs):
super(MeterToKmField, self).__init__(max_value, 0, *args, **kwargs)
def to_python(self, value):
result = super(MeterToKmField, self).to_python(value)
result *= 1000
return result
【问题讨论】:
标签: python django forms django-forms