如何使用Radio Select渲染Django表单而不会默认获得选中的单选按钮?

时间:2010-07-14 17:41:26

标签: django

在Django 1.2.1上我正在使用ModelForm并使用radiobuttons生成一个表单:

class myModelForm(ModelForm):    
    class Meta:
        model = myModel
        widgets = {
            'choose': RadioSelect(),
        } 


这会产生一个带有虚假值的额外输入:

<li><input type="radio" id="id_choose_0" value="" name="choose1" /> ---------</li>
<li><input type="radio" id="id_choose_1" value="1" name="choose1" /> First choice</li>


我知道我可以通过设置默认值来删除自动生成的空输入字段:

myChoices = (
    ("1", "First choice"),("2", "Second choice"),("3", "Third choice"),
)    

class myModel(models.Model):
    choose = models.CharField(max_length=1, choices=myChoices, default=1...


所以在这种情况下,选择第一个选择:

<li><input checked="checked" type="radio" id="id_choose_1" value="1" name="choose1" /> First choice</li>
<li><input type="radio" id="id_choose_2" value="2" name="choose2" /> Second choice</li>

但是如何在没有选中输入属性的情况下渲染表单?

(没有自动生成的)

3 个答案:

答案 0 :(得分:14)

这是一种hacky解决方案,但我已经测试了它的工作原理:只需将字段的默认值设置为不是其中一个选项的值(我建议将其设置为None) 。渲染表单时,Django不会知道哪个输入标记为已选中,因此它将使所有这些输入都未被选中(不会抛出错误)。并且存在默认意味着不会有自动生成的输入字段。

答案 1 :(得分:11)

在Django 1.6中(未在其他版本中测试),您只需要default=None

class myModel(models.Model):
    choose = models.CharField(..., default=None)

class myModelForm(ModelForm):
    class Meta:
        model = myModel
        widgets = {
            'choose': RadioSelect(),
        }

答案 2 :(得分:4)

之前的解决方案对我不起作用。

因此,我只是选择了第一个小部件的选择。

class myModelForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(ContactForm, self).__init__(*args, **kwargs)
        self.fields['choose'].choices = self.fields['choose'].choices[1:]

    class Meta:
        model = myModel
        widgets = {
            'choose': RadioSelect(),
        }