2013-09-27 3 views
0

Скажем, у меня есть установка, похожее на это:Динамически изменить возвращаемое поле значения Джанго модели

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

Переопределите метод вашего поля модели и установите 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. Как насчет отображения значения на шаблонах? Тогда мне нужен настраиваемый фильтр шаблонов ... Что делать, если я хочу иметь разные формы с этим полем? Чем я должен повторять этот код снова и снова ... звучит не очень DRY ... – 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

Смежные вопросы