1

我需要针对此问题的解决方案:多字段和计算值

我想为“值”字段使用MultiField小部件。此字段应允许输入两个值(两个输入窗口小部件),用户应选择要保存这些值中的哪一个(两个复选框窗口小部件)。但是,其中一个值必须重新计算其他字段的值。

我已经采取了这种做法: 一个MultiValueField有4个字段:

class PriceDetailField(MultiValueField): 
    use_net = BooleanField(required=False) 
    net_value = DecimalField(required=False, decimal_places=2) 
    use_gross = BooleanField(required=False) 
    gross_value = DecimalField(required=False, decimal_places=2) 

一个MultiWidget:

class PriceDetailWidget(MultiWidget): 
    use_net = CheckboxInput() 
    net_value_widget = TextInput() 
    use_gross = CheckboxInput() 
    gross_value_widget = TextInput() 

和自定义表单...

class PriceModelForm(ModelForm): 
    value = PriceDetailField() 

。 ..它覆盖了模型的默认模型形式:

class Price(models.Model): 
    value = models.DecimalField(
     max_digits=19, 
     decimal_places=2, 
     default=Decimal(0), 
     ) 

但是,这种解决方案似乎是搞砸了。在表格中,我需要输入所有子字段(MultiValueField子字段),否则出现“请输入值”错误(即使这些字段标记为required=False)。此外, 我必须重新计算保存时提到的值,从字段中返回一个元组,其中复选框被选中的信息和相应的文本值,然后用clean_value表单的方法替换元组中的十进制值(同时保存复选框在临时字段中声明....)。我认为这样的设计非常薄弱。

表单既可以独立工作,也可以内联(这意味着用于计算返回值的字段的值在保存期间可以或不可以更改)。

这样的事情甚至可能吗?


而问题的根源:我要存放物品的净值,价格计算的价格,但我想,让用户输入他们的毛重和净重的价格,然后总价格重新计算净价格与尊重产品的增值税税率(因为增值税被分配给产品或服务,而不是价格)。产品可以有很多价格,所以价格通过外键反向链接到产品。

干杯, 托梅克

回答

0

你在一个MultiValueField(允许被要求或没有单独的子域)寻找的功能被记录为a feature request on Django

你也许可以通过基于从bug报告原件及以下建议重写clean方法继承MultiValueField解决这个现在。尽管如此,你还不会有很多原来的MultiValueField,如果你这样做,你应该把你的补丁提交给Django并且在这个bug上注释一下。

暂时忽略所需要的东西,你在PriceDetailField上写了一个compress方法吗?它是什么样子的?这就是你应该把你的四个子字段变成单个字段来保存的工作。

+0

我通过MultiValueField清理方法来了,我意识到它调用了compress。所以,所要做的就是正确实施压缩方法。现在,它返回计算的十进制数(因为我在构造时将整个表单链接到了字段,所以我可以访问需要计算MVF字段值的字段),抛出ValidationError(如果子字段的组合不合法)或返回None 。我还必须重新实现MultiWidget的_has_changed方法。除了将表单的引用传递给字段之外,表单中没有字段逻辑。 – tomek

+0

您可以指定如何在模板中分别访问MultiValueField的子字段? – gorus