我需要針對此問題的解決方案:多字段和計算值
我想爲「值」字段使用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
表單的方法替換元組中的十進制值(同時保存複選框在臨時字段中聲明....)。我認爲這樣的設計非常薄弱。
表單既可以獨立工作,也可以內聯(這意味着用於計算返回值的字段的值在保存期間可以或不可以更改)。
這樣的事情甚至可能嗎?
而問題的根源:我要存放物品的淨值,價格計算的價格,但我想,讓用戶輸入他們的毛重和淨重的價格,然後總價格重新計算淨價格與尊重產品的增值稅稅率(因爲增值稅被分配給產品或服務,而不是價格)。產品可以有很多價格,所以價格通過外鍵反向鏈接到產品。
乾杯, 託梅克
我通過MultiValueField清理方法來了,我意識到它調用了compress。所以,所要做的就是正確實施壓縮方法。現在,它返回計算的十進制數(因爲我在構造時將整個表單鏈接到了字段,所以我可以訪問需要計算MVF字段值的字段),拋出ValidationError(如果子字段的組合不合法)或返回None 。我還必須重新實現MultiWidget的_has_changed方法。除了將表單的引用傳遞給字段之外,表單中沒有字段邏輯。 – tomek
您可以指定如何在模板中分別訪問MultiValueField的子字段? – gorus