多字段和计算值

时间:2011-09-07 09:19:53

标签: django django-models django-admin django-forms django-widget

我需要一个解决这个问题的方法:

我想将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形式的方法替换元组中的小数值(同时,保存临时字段中的复选框状态....)。我认为这样的设计非常薄弱。

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

这样的事情是否可能?


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

干杯, 托梅克

1 个答案:

答案 0 :(得分:0)

您在MultiValueField上寻找的功能(允许或不需要单独的子字段)记录为a feature request on Django

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

暂时忽略了必要性,您是否在compress上写了PriceDetailField方法?它是什么样子的?这是您应该将四个子字段转换为单个字段进行保存的工作。