Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django ModelForm能否显示存储值的自定义表示?_Python_Django_Forms - Fatal编程技术网

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

Python Django ModelForm能否显示存储值的自定义表示?,python,django,forms,Python,Django,Forms,在我的模型中,百分比数据存储为0.0-1.0范围内的分数值。因为它们是百分比,所以我希望用户查看和编辑0.0-100.0范围内的值 在其存储值和显示值之间转换数据的首选方式是什么?请注意,格式取决于另一个实例变量 我的模型如下所示: class MyModel(models.Model): format = models.CharField(choices=(('percentage', 'Percentage'), ('absolute', 'Absolute')) my_va

在我的模型中,百分比数据存储为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)
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
在表单中,我尝试将display属性用作表单字段,但这不起作用(为MyModel指定的未知字段(my_value_display)):


就个人而言,我可能会尝试创建一个
django.forms.FloatField
子类和一个
django.forms.TextInput
子类,类似这样:

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)
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()

在某些情况下,它可能会失败,也可能是在用户提供无效值的情况下,但基本思想应该是正确的。

就我个人而言,我可能会尝试创建一个
django.forms.FloatField
子类和一个
django.forms.TextInput
子类,类似这样:

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)
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()

在某些情况下,它可能会失败,也可能是在用户提供无效值时,但基本思路应该是正确的。

如果格式化是有条件的,并且基于示例中的“format”实例变量,会发生什么情况?在这种情况下,表单的清理部分可以通过覆盖表单的
clean
方法来实现。我真的不知道这个小部件怎么样。可能创建两个不同的
ModelForm
类,然后在模型上使用一个方法,根据format的值检索正确的类。如果在呈现函数中缺少“return”关键字,那么如果格式化是有条件的,并且基于示例中的“format”实例变量,会发生什么?在这种情况下,表单的清理部分可以通过覆盖表单的
clean
方法来实现。我真的不知道这个小部件怎么样。可能创建两个不同的
ModelForm
类,然后在模型上使用一个方法根据format的值检索正确的类。渲染函数中缺少“return”关键字吗