2013-09-27 27 views
0

比方說,我有一個類似的設置:動態改變的Django模型的現場返回值

class UnitsOfMeasure(models.Model): 
    name = models.CharField(max_length=40) 
    precision = models.PositiveIntegerField() 

class Product(models.Model): 
    name = models.CharField(max_length=100) 
    uom = models.ForeignKey(UnitsOfMeasure) 
    qty_available = models.DecimalField(max_tigits=10, decimal_places=10) 

現在讓我們說我們有涉及與精確測量實例的單位產品= 2 我該怎麼辦qty_available會返回5.50而不是5.5000000000?

我知道我可以使用屬性裝飾器,但這並不能解決我的問題,因爲我想在表單中使用qty_available作爲字段。

自定義字段類型?我怎樣才能傳遞和訪問相關的模型實例?

您的想法非常感謝!

回答

1

覆蓋模型字段的__init__方法,並根據相關測量單位設置max_digits

class ProductForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(ProductForm, self).__init__(*args, **kwargs) 
     self.fields['qty_available'] = models.DecimalField(max_digits=10, decimal_places=self.instance.uom.precision) 
    class Meta: 
     model = Product 
+0

這隻有在的ModelForm解決問題。如何在模板上顯示值?然後,我需要自定義模板過濾器...如果我想與此字段具有不同的形式,該怎麼辦?比我不得不一遍又一遍地重複這段代碼......聽起來不是非常幹... – Simanas

+0

您可以使用屬性或模板標籤進行演示。如果你需要多個表單,那麼你應該能夠使用繼承來減少重複的代碼。這可能不會像您喜歡的那樣幹,您可能可以通過自定義字段做些更聰明的事情,但我不確定它會如何簡單易懂。 – Alasdair

0

如果它只是一個演示的問題,你可以在你的模板使用simple_tag

@register.simple_tag 
def format_qty_available(product): 
    return product.qty_available.quantize(Decimal(10) ** -product.uom.precision) 
+0

這不會爲表單域工作。如果這是一種方法,你最好創建一個模型屬性,而不是模板標籤 – karthikr

+0

「胖」模型,你是對的。謝謝。但正如你所說,我無論如何都錯過了這個問題的關鍵。 – Germano