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)

一个多部件:

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(另外,保存复选框状态在临时领域......)。我认为这样的设计非常薄弱。

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

这样的事情甚至可能吗?


问题的根源:我想将商品的价格存储为净价,但我想允许用户将它们输入为净价或毛价,然后根据产品的增值税水平将毛价重新计算为净价(因为增值税是分配给产品或服务的,而不是价格)。一个产品可以有多个价格,因此价格通过外键反向链接到该产品。

干杯,托梅克

4

1 回答 1

0

您在 a 上查找的功能MultiValueField(允许需要或不单独需要子字段)被记录为Django 上的功能请求

您现在可能可以通过使用基于原始和错误报告中的建议MultiValueField的重写方法进行子类化来解决此问题。不过到那时你不会留下clean很多原始文件,如果你这样做了,你应该将你的补丁提交给 Django 并在错误上写下注释。MultiValueField

暂时忽略必要的事情,你有没有compress在你的PriceDetailField. 它是什么样子的?这是你应该做的工作,将你的四个子字段变成一个单独的字段来保存。

于 2011-09-07T23:34:42.750 回答