我需要针对此问题的解决方案:多字段和计算值
我想为“值”字段使用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
表单的方法替换元组中的十进制值(同时保存复选框在临时字段中声明....)。我认为这样的设计非常薄弱。
表单既可以独立工作,也可以内联(这意味着用于计算返回值的字段的值在保存期间可以或不可以更改)。
这样的事情甚至可能吗?
而问题的根源:我要存放物品的净值,价格计算的价格,但我想,让用户输入他们的毛重和净重的价格,然后总价格重新计算净价格与尊重产品的增值税税率(因为增值税被分配给产品或服务,而不是价格)。产品可以有很多价格,所以价格通过外键反向链接到产品。
干杯, 托梅克
我通过MultiValueField清理方法来了,我意识到它调用了compress。所以,所要做的就是正确实施压缩方法。现在,它返回计算的十进制数(因为我在构造时将整个表单链接到了字段,所以我可以访问需要计算MVF字段值的字段),抛出ValidationError(如果子字段的组合不合法)或返回None 。我还必须重新实现MultiWidget的_has_changed方法。除了将表单的引用传递给字段之外,表单中没有字段逻辑。 – tomek
您可以指定如何在模板中分别访问MultiValueField的子字段? – gorus