如何摆脱Django Form的RadioSelect产生的虚假选择

tam*_*are 11 python django django-forms

我在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')
...
Run Code Online (Sandbox Code Playgroud)

forms.py:

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

当这个小部件呈现为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> 
Run Code Online (Sandbox Code Playgroud)

问题: 如何摆脱伪造的选择"--------"?

几个月之前另一个stackoverflow用户提出了同样的问题(这里).我已经在那里尝试了可接受的解决方案(如你所见),但这对我不起作用.

小智 9

即使没有空白= True,它也会显示额外的输入.我创建了一个新的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)
Run Code Online (Sandbox Code Playgroud)

  • NickJ的回答似乎是正确的,但我想补充一点.如果我没有弄错,在以下行中选择= list(chain(self.choices,choices))链需要额外的导入:来自itertools导入链 (2认同)

frn*_*nhr 5

设置blank=False(或只是删除它)并添加default='Unspecified'