2011-04-28 55 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)