2011-08-16 41 views
0

在我的模型中,百分比数据作为小数值存储在0.0-1.0范围内。由于它们是百分比,我希望用户查看和编辑0.0-100.0范围内的值。Django ModelForm可以显示存储值的自定义表示吗?

存储值显示值之间转换数据的首选方式是什么?请注意,格式取决于另一个实例变量。

我的模型看起来是这样的:

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) 

在表单中,我试图用显示属性为表单域,但不工作(指定未知领域(S)(my_value_display)为MyModel):

class MyForm(forms.ModelForm): 

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

回答

3

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

它可能在用户提供一个非法值无法在几个角落的情况下,也许还可以,但基本的思路应该是没事的。

+0

如果格式是有条件的,并且基于'format'实例变量(如示例中),会发生什么? – Frederik

+0

在这种情况下,可以通过覆盖表单的“干净”方法来实现表单的清理部分。我真的不知道小部件怎么样。也许创建两个不同的'ModelForm'类,然后在模型上有一个方法根据格式的值检索正确的类。 – koniiiik

+0

你在渲染功能中缺少“return”关键字 –

相关问题