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) 

一個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

你在一個MultiValueField(允許被要求或沒有單獨的子域)尋找的功能被記錄爲a feature request on Django

你也許可以通過基於從bug報告原件及以下建議重寫clean方法繼承MultiValueField解決這個現在。儘管如此,你還不會有很多原來的MultiValueField,如果你這樣做,你應該把你的補丁提交給Django並且在這個bug上註釋一下。

暫時忽略所需要的東西,你在PriceDetailField上寫了一個compress方法嗎?它是什麼樣子的?這就是你應該把你的四個子字段變成單個字段來保存的工作。

+0

我通過MultiValueField清理方法來了,我意識到它調用了compress。所以,所要做的就是正確實施壓縮方法。現在,它返回計算的十進制數(因爲我在構造時將整個表單鏈接到了字段,所以我可以訪問需要計算MVF字段值的字段),拋出ValidationError(如果子字段的組合不合法)或返回None 。我還必須重新實現MultiWidget的_has_changed方法。除了將表單的引用傳遞給字段之外,表單中沒有字段邏輯。 – tomek

+0

您可以指定如何在模板中分別訪問MultiValueField的子字段? – gorus