如何去除Django表单RadioSelect生成的虚假选项
我在使用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)