2011-08-16 66 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」關鍵字 –

相關問題