Django ModelForm 可以显示存储值的自定义表示吗?

Fre*_*rik 1 python forms django

在我的模型中,百分比数据存储为 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)
Run Code Online (Sandbox Code Playgroud)

在表单中,我尝试使用显示属性作为表单字段,但这不起作用(为 MyModel 指定了未知字段(my_value_display)):

class MyForm(forms.ModelForm):

    class Meta:
        model = MyModel
        fields = ('my_value_display', )
Run Code Online (Sandbox Code Playgroud)

kon*_*iik 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
Run Code Online (Sandbox Code Playgroud)

然后就ModelForm这样定义你的:

class MyForm(forms.ModelForm):
    my_value = PercentageField()
Run Code Online (Sandbox Code Playgroud)

它可能会在一些极端情况下失败,也许当用户提供无效值时也会失败,但基本思想应该没问题。