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

发布于 2021-01-29 15:59:30

我在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用户也提出了相同的问题(Here)。我已经在那里尝试了可接受的解决方案(如您所见),但这对我没有用。

关注者
0
被浏览
43
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    即使没有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)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看