2011-03-23 28 views
0

我有兩個ModelField(Char和Decimal),使用clean_formfield()方法分別清理它們會很簡單。但是,爲了顯示這兩個表單域,我想只顯示一個輸入字段與ChoiceField的組合,用戶可以決定下一個輸入是某些單詞還是數字。分割是必要的,因爲我希望稍後與數字進行彙總。後Formfield清理 - 清理Formfield中的子類

很明顯,我不能使用clean_formfield()因爲依賴性,所以它必須進入窗體清理器。問題是如何實現「後期清潔」?

class Input(models.Model): 
    ... 
    number = models.DecimalField() 
    word = models.CharField() 
    ... 

class InputForm(forms.ModelForm): 
    ... 
    type = forms.CharField(widget=forms.RadioSelect(choices=(('word','Word'),('number','Number'),))) 
    input = forms.CharField() 
    ... 
    def clean(self): 
     cleaned_data = self.cleaned_data 
     type = cleaned_data.get('type') 
     input = cleaned_data.get('input') 

    if type == 'number':   
     <<<clean_Decimal_Formfield>>> 
     cleaned_data['number'] = input 
     cleaned_data['word'] = None 
    else: 
     <<<clean_Char_Formfield>>>   
     cleaned_data['number'] = None 
     cleaned_data['word'] = input 

    return cleaned_data 

回答

0

沒有必要發明一種新的方法來進行'晚期字段清理'!只是這樣做:

... 
if type == 'number':   
    cleaned_data['number'] = input 
    cleaned_data['word'] = None 
else: 
    cleaned_data['number'] = None 
    cleaned_data['word'] = input 
... 
+0

好,但現在你缺少現場驗證!輸入將包含或有效的charfield或某個有效的小數域! – 2011-03-25 13:28:32

0

我會堅持這一點,1模型字段= 1表單域。 如果您只需要保存一個字段(數字或文本),您可以隱藏/顯示基於無線電選擇狀態的兩個字段(平凡的js)

爲了防止保存兩個值而不是清除表單可以檢查只填充了一個字段,並且與無線電選擇兼容。

+0

這是一個選項,但我更喜歡在後端處理這些事情儘可能。 – Holger 2011-03-25 12:07:58