【发布时间】:2011-11-11 23:40:59
【问题描述】:
我需要解决这个问题:
我想要一个“值”字段的 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 表单方法中的十进制值替换元组(另外,保存复选框临时字段中的状态....)。我觉得这样的设计很弱。
表单应该既可以独立工作,也可以作为内联工作(这意味着,用于计算返回值的字段的值可以在保存期间更改,也可以不更改)。
这样的事情有可能吗?
问题的根源:我想将商品的价格存储为净价,但我希望允许用户将它们输入为净价或毛价,然后根据产品的增值税将毛价重新计算为净价税级(因为增值税分配给产品或服务,而不是价格)。一个产品可以有多个价格,因此价格通过外键反向链接到该产品。
干杯, 托梅克
【问题讨论】:
标签: django django-models django-admin django-forms django-widget