【问题标题】:How to render a Django form with RadioSelect without getting a checked radiobutton by default?默认情况下,如何使用 RadioSelect 呈现 Django 表单而不获取选中的单选按钮?
【发布时间】:2010-07-14 17:41:25
【问题描述】:

在 Django 1.2.1 上,我使用 ModelForm 并使用单选按钮生成表单:

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>

但是如何在没有选中输入属性的情况下呈现我的表单呢?

(并且没有自动生成的)

【问题讨论】:

    标签: django


    【解决方案1】:

    这是一种 hacky 解决方案,但我已经对其进行了测试:只需将字段的默认值设置为不是选项之一的值(我建议将其设置为 None)。渲染表单时,Django 不知道将哪个输入标记为已选中,因此它将使所有输入都处于未选中状态(不会引发错误)。并且存在默认值这一事实意味着不会有自动生成的输入字段。

    【讨论】:

    • 它有效,我不认为它特别hacky,除非其他人提供更深入的解决方案(因为我发现该领域缺乏文档)我会将其标记为正确答案。谢谢
    【解决方案2】:

    在 Django 1.6 中(没有在其他版本中测试过)你只需要default=None:

    class myModel(models.Model):
        choose = models.CharField(..., default=None)
    
    class myModelForm(ModelForm):
        class Meta:
            model = myModel
            widgets = {
                'choose': RadioSelect(),
            }
    

    【讨论】:

    • 这在 1.6.2 中有效,但如果您也将 blank=True 作为参数传递给 forms.RadioSelect,即使您使用它也会保留默认选项“-------” default=None。你必须删除blank=True
    • @Deepend blank=True 是一个核心 model 字段参数。等效形式为required=False。但这在 RadioSelect 上很奇怪,因为用户无法取消选择单选按钮。无论如何,空白不是形式的东西。如果您创建模型表单,模型中的空白=True 将成为表单中的必需=False。通过重新定义模型表单中的字段,您可以在模型表单字段上设置 required=True 而无需在模型中触摸空白=True。 docs.djangoproject.com/en/1.8/topics/forms/modelforms
    【解决方案3】:

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

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

    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(),
            } 
    

    【讨论】:

    • 对于ModelChoiceField,你可以使用这个self.fields['choose'].choices = [(c.id, c.field_name_to_display) for c in self.fields['choose'].queryset]
    猜你喜欢
    • 2018-09-04
    • 1970-01-01
    • 2019-03-29
    • 2015-10-02
    • 1970-01-01
    • 2011-08-01
    • 2019-06-28
    • 1970-01-01
    • 2017-12-16
    相关资源
    最近更新 更多