如何去除Django表单RadioSelect生成的虚假选项

11 投票
5 回答
4176 浏览
提问于 2025-04-16 16:36

我在使用Django 1.3的ModelForm。

这是我的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(),
        }

当这个小部件被渲染成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的用户也提到了同样的问题(在这里)。我尝试了那里的解决方案(如你所见),但对我来说并没有奏效。

5 个回答

1

你可以在设置小部件的时候指定选项。它显示“----”是因为在你的模型里设置了blank=True,这意味着这个字段可以留空。

只需要使用小部件的choices参数,把它设置为你在模型中定义的选项就可以了。

6

blank=False 设置成 False(或者干脆把它去掉),同时加上 default='Unspecified'

9

即使没有设置blank=True,它仍然会显示额外的输入框。我创建了一个新的控件:

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)

撰写回答