2015-08-21 47 views
0

我有一個Django Model字段是models.CharField是否可以自定義forms.Booleanfield對應「true」和「false」值?

相應形式總是通過一個ModelForm產生,但以下一些自定義邏輯,I有時替換爲forms.BooleanField關聯到默認字段。

有沒有辦法來決定forms.BooleanField預期和返回的實際值,而不是默認的TrueFalse? (我想在模型字段中使用字符'1'和'0')。


要告訴更多的只是一些有關的理由替換默認forms.Field,按升序排列重要性:

  • 要使用適合於期望的輸入窗口小部件呈現給用戶。
  • 獲取forms.Field驗證。
+2

你這樣做是因爲你想要一個複選框小部件嗎?因爲將CharField的小部件更改爲滿足您的要求的自定義小部件可能是一個更好的主意。 – henrikstroem

+0

@henrikstroem感謝您的評論。複選框小部件確實是我想要這樣做的原因之一。然而,主要原因是我希望表單驗證提供的「用戶輸入」確實是二元選擇這一事實,而且我的理解是,**驗證**實際上是「forms.Field」業務。 –

+0

那麼你最好使用forms.ChoiceField。 –

回答

2

正如丹尼爾所說,我認爲forms.ChoiceField更好。您已經提到過,這是模型中的models.CharField,但forms.BooleanField被設計爲僅返回True/False值。另一方面,forms.ChoiceField可以接受任何固定的選擇,您可以從多個小部件中進行選擇以自定義顯示。大多數情況下,我使用默認的SelectRadioSelect。既然你提到你想使用字符串「1」和「0」的這種特殊情況下,你可以這樣做:

blah_field = forms.ChoiceField(choices=(('1', 'Yes'), ('0', 'No'))) 

或:

blah_field = forms.ChoiceField(choices=(('1', 'Yes'), ('0', 'No')), 
           widget=forms.RadioSelect) 

另外,如果你真的想使用複選框,也可以使用forms.BooleanField。而不是做任何驗證,這是不需要的,你有責任編寫代碼來自己將True轉換爲'1',False'0',這根本不復雜。

首先,你需要確保你的Models.CharFieldnull=True就可以了。總之,做views.py,轉換在那裏你會保存表單:

form = BlahForm(request.POST) 
if form.is_valid(): 
    blah_field_value = form.cleaned_data['blah_field'] 
    blah_value = '1' if blah_field_value else '0' 
    new_blah_obj = form.save(commit=False) 
    new_blah_obj.blah_field = blah_value 
    new_blah_obj.save() 

如果你不知道該代碼是幹什麼的,請看看herehere

+0

謝謝你的回答:我喜歡你所描述的兩個方向。你能否給第二種方法指出更多的指針「*編寫代碼將True轉換爲'1',將False自己轉換爲'0'*」?特別是,這個代碼應該放在哪裏? (不是轉換代碼本身;) –

+0

請看我更新的答案。再想一想,它可能無法工作,但請嘗試讓我知道,我會修改答案。原因是:當你保存()時,django會嘗試將'forms.BooleanField'中的數據保存到'models.CharField'中,我不確定它是否會起作用。 –

相關問題