以django形式显示布尔模型字段作为单选按钮而不是默认的复选框

时间:2009-06-23 15:53:07

标签: django django-forms validation

这就是我的方法,在表单中显示一个布尔模型字段作为单选按钮是和否。

choices = ( (1,'Yes'),
            (0,'No'),
          )

class EmailEditForm(forms.ModelForm):

    #Display radio buttons instead of checkboxes
    to_send_form = forms.ChoiceField(choices=choices,widget=forms.RadioSelect)

    class Meta:
    model = EmailParticipant
    fields = ('to_send_email','to_send_form')

    def clean(self):
    """
    A workaround as the cleaned_data seems to contain u'1' and u'0'. There may be a better way.
    """

    self.cleaned_data['to_send_form'] = int(self.cleaned_data['to_send_form'])
    return self.cleaned_data

正如您在上面的代码中看到的,我需要一个将输入字符串转换为整数的干净方法,这可能是不必要的。

是否有更好的和/或djangoic方式来做到这一点。如果是这样,怎么样?

不,使用BooleanField似乎会导致更多问题。使用它对我来说似乎很明显;但事实并非如此。为什么会这样。

4 个答案:

答案 0 :(得分:15)

使用TypedChoiceField

class EmailEditForm(forms.ModelForm):
    to_send_form = forms.TypedChoiceField(
                         choices=choices, widget=forms.RadioSelect, coerce=int
                    )

答案 1 :(得分:6)

field = BooleanField(widget=RadioSelect(choices=YES_OR_NO), required=False)


YES_OR_NO = (
    (True, 'Yes'),
    (False, 'No')
)

答案 2 :(得分:2)

如果需要水平渲染器,请使用此选项。

http://djangosnippets.org/snippets/1956/

答案 3 :(得分:1)

如果你想处理布尔值而不是整数值,那么就可以这样做了。

forms.TypedChoiceField(
    choices=((True, 'Yes'), (False, 'No')),
    widget=forms.RadioSelect,
    coerce=lambda x: x == 'True'
)