2011-04-28 58 views
10

我在Django 1.3上使用ModelForm。如何擺脫由Django表單RadioSelect生成的假選擇

models.py:

class UserProfile(models.Model): 
... 
gender = models.CharField(max_length=1, blank=True, choices=(('M', 'Male'), ('F', 'Female'), ('Unspecified', '')), default='M') 
... 

forms.py:

class UserProfileForm(ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('gender') 
     widgets = { 
      'gender': forms.RadioSelect(), 
     } 

當這個widget被渲染成HTML,我

<ul> 
<li><label for="id_gender_0"><input type="radio" id="id_gender_0" value="" name="gender" />---------</label></li> 
<li><label for="id_gender_1"><input checked="checked" type="radio" id="id_gender_1" value="M" name="gender" /> Male</label></li> 
<li><label for="id_gender_2"><input type="radio" id="id_gender_2" value="F" name="gender" />Female</label></li> 
<li><label for="id_gender_3"><input type="radio" id="id_gender_3" value="" name="gender" /> Unspecified</label></li> 
</ul> 

問題: 哪有我擺脫了「--------」這個虛假選擇?

同樣的問題是由另一個stackoverflow用戶在幾個月前提出的(Here)。我嘗試了在那裏接受的解決方案(正如你所看到的),但那對我並不起作用。

回答

9

即使沒有空白=真,它顯示額外的輸入。我創建了一個全新的Widget:

from itertools import chain 
from django.forms import RadioSelect 
from django.utils.encoding import force_unicode 

class RadioSelectNotNull(RadioSelect): 
    def get_renderer(self, name, value, attrs=None, choices=()): 
     """Returns an instance of the renderer.""" 
     if value is None: value = '' 
     str_value = force_unicode(value) # Normalize to string. 
     final_attrs = self.build_attrs(attrs) 
     choices = list(chain(self.choices, choices)) 
     if choices[0][0] == '': 
      choices.pop(0) 
     return self.renderer(name, str_value, final_attrs, choices) 
+2

NickJ的答案似乎是正確的,但我想補充一件事。如果我沒有弄錯,在下面的行選擇=列表(鏈(self.choices,選擇))鏈需要額外的進口:從itertools進口鏈 – 2012-04-02 03:22:00

1

您可以在設置小部件時設置選項。它顯示了----因爲在你的模型中你有空白=真。

只需使用小部件的選項arg並將其設置爲您在模型中設置的選項即可。

+0

這發生在我身上,即使'空白= FALSE'型號。 – 2017-09-19 19:12:32

5

設置blank=False(或只是將其刪除),並添加default='Unspecified'

+0

在Django 1.4.5,這效果很好,謝謝! – mkoistinen 2013-04-20 11:18:30

1

默認情況下使用ModelChoiceField將在列表頂部的空選擇的部件。

你可以(在默認情況下是「---------」)與empty_label屬性更改此標籤的文本,或者您也可以通過設置empty_label到無完全禁用空標籤:

定製的空標籤:

field1 = forms.ModelChoiceField(queryset=..., empty_label="(Nothing)") 

沒有空標籤:

field2 = forms.ModelChoiceField(queryset=..., empty_label=None)