Skip to main content
 首页 » 编程设计

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

2024年09月03日31fff_TT

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

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

class MyForm(forms.ModelForm): 
 
    class Meta: 
        model = MyModel 
        fields = ('my_value_display', ) 

请您参考如下方法:

就个人而言,我可能会尝试创建一个 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() 

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