Django ModelForm能否显示存储值的自定义表示?

1 投票
1 回答
1285 浏览
提问于 2025-04-16 23:40

在我的模型中,百分比数据是以0.0到1.0之间的小数值存储的。因为这些是百分比,所以我希望用户能看到并编辑0.0到100.0之间的数值。

那么,如何在存储值显示值之间进行转换是比较好的方法呢?需要注意的是,这个格式还依赖于另一个实例变量。

我的模型大致是这样的:

class MyModel(models.Model):
    format = models.CharField(choices=(('percentage', 'Percentage'), ('absolute', 'Absolute'))
    my_value = models.FloatField()

    def _get_my_value_display(self):
        if self.format == 'percentage':
            return self.my_value * 100
        else:
            return self.my_value

    def _set_my_value_display(self, v):
        if self.format == 'percentage':
            return v / 100
        else:
            return self.my_value

    my_value_display = property(_get_my_value, _set_my_value)

在表单中,我尝试把显示属性当作一个表单字段来用,但这样不行(未知字段(my_value_display)在MyModel中被指定):

class MyForm(forms.ModelForm):

    class Meta:
        model = MyModel
        fields = ('my_value_display', )

1 个回答

5

我个人觉得,可以尝试创建一个 django.forms.FloatField 的子类和一个 django.forms.TextInput 的子类,像这样:

class PercentageInput(TextInput):
    def render(self, name, value, attrs=None):
        try:
            value = float(value)
            value *= 100
        except ValueError:
            pass
        return super(PercentageInput, self).render(name, value, attrs)

class PercentageField(FloatField):
    widget = PercentageInput
    def to_python(self, value):
        value = super(PercentageField, self).to_python(value)
        return value / 100

然后就可以这样定义你的 ModelForm

class MyForm(forms.ModelForm):
    my_value = PercentageField()

可能在一些特殊情况下会出问题,比如用户输入了无效的值,但基本思路应该是没问题的。

撰写回答