2011-09-02 23 views
14

在文檔中,nullbooleanfield表示as a <select> box with "Unknown", "Yes" and "No" choices.如何將select的值更改爲其他更有意義的文本,並將其映射回我的modelform中的yes,no和未知值?django:如何更改模型中的nullbooleanfield的值?

例如我有yes_no_required = models.NullBooleanField(),我希望'yes I acknowledge this''no, I do not like this''I do not know now'映射到是,否和相應要求。

回答

29

我花了半個小時組建了一個演示只是爲了證明自己這部作品:

CHOICES = (
    (None, "I do not know now"), 
    (True, "Yes I acknowledge this"), 
    (False, "No, I do not like this") 
) 

class Demo(models.Model): 
    yes_no_required = models.NullBooleanField(choices = CHOICES) 

class DemoForm(forms.ModelForm): 
    class Meta: 
     model = Demo 

我在Django的源代碼看。 一切可以接受一個選擇數組。顯然,對於那些沒有道理的人來說,這是可能的。

+3

看起來像Django增加了另一個選擇爲null到FormFi因爲null-attr被設置爲true。您還需要將選項傳遞給FormField,以將其限制爲這些選項,而不是額外的虛線null選項。 – codingjoe

+0

這似乎不起作用了。 TypeError:__init __()得到了一個意想不到的關鍵字參數'choices' –

3

你可以像這樣的形式處理這個(withouth的修改模型):

forms.NullBooleanField(
    widget=forms.RadioSelect(renderer=HorizontalRadioRendererSpace, 
     choices=CHOICES), 
    label='...', 
    required=False) 

我認爲這是一個壞主意,用NullBooleanField對於能夠在像三個態數據:是/否警戒/解除警戒。

編輯數據作品。但是如果你想爲這些數據編寫一個搜索表單,就會產生很大的麻煩。

那麼「空」值可以有兩種含義:

  • 不關心這個屬性。包含所有行
  • 僅包含這些行,其中列爲NULL。

解決方法很簡單:使用ChoiceField。

更多細節在這裏:https://github.com/guettli/programming-guidelines/blob/master/README.rst

2

您可以修改字段的控件在您的ModelForm元類:

CHOICES = (
      (None, "I do not know now"), 
      (True, "Yes I acknowledge this"), 
      (False, "No, I do not like this"), 
      ) 
class DemoForm(forms.ModelForm): 
    class Meta: 
     model = Demo 
     fields = ("demo_field",) 
     widgets = { 
       'demo_field': forms.RadioSelect(choices = CHOICES), 
        } 
1

簡單的方法是改變你的表單控件的選擇:

class YourForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(YourForm, self).__init__(*args, **kwargs) 
     new_choices = ((1, 'I do not know now'), 
         (2, 'Yes I acknowledge this'), 
         (3, 'No, I do not like this')) 
     self.fields['your_field'].widget.choices = new_choices 
相關問題