我需要解决这个问题:
我想要一个“值”字段的 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)
一个多部件:
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
(另外,保存复选框状态在临时领域......)。我认为这样的设计非常薄弱。
表单应该既可以单独工作,也可以作为内联工作(这意味着,用于计算返回值的字段的值可以在保存期间更改,也可以不更改)。
这样的事情甚至可能吗?
问题的根源:我想将商品的价格存储为净价,但我想允许用户将它们输入为净价或毛价,然后根据产品的增值税水平将毛价重新计算为净价(因为增值税是分配给产品或服务的,而不是价格)。一个产品可以有多个价格,因此价格通过外键反向链接到该产品。
干杯,托梅克