我需要一个解决这个问题的方法:
我想将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 :(得分:0)
您在MultiValueField
上寻找的功能(允许或不需要单独的子字段)记录为a feature request on Django。
您现在可以通过基于错误报告中的原始和以下建议使用重写的MultiValueField
方法对clean
进行子类化来解决此问题。你不会在那一点上留下很多原始的MultiValueField
,如果你这样做,你应该把你的补丁提交给Django并记下这个bug。
暂时忽略了必要性,您是否在compress
上写了PriceDetailField
方法?它是什么样子的?这是您应该将四个子字段转换为单个字段进行保存的工作。