lprsd
lprsd

Reputation: 87225

Display a boolean model field in a django form as a radio button rather than the default Checkbox

This is how I went about, to display a Boolean model field in the form as Radio buttons Yes and No.

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

As you can see in the code above, I need a clean method that converts input string to an integer, which may be unnecessary.

Is there a better and/or djangoic way to do this. If so, how?

And no, using BooleanField seems to cause a lot more problems. Using that seemed obvious to me; but it isn't. Why is it so.

Upvotes: 14

Views: 12240

Answers (4)

jhrr
jhrr

Reputation: 1730

If you want to deal with boolean values instead of integer values then this is the way to do it.

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

Upvotes: 2

Daniel Roseman
Daniel Roseman

Reputation: 600059

Use TypedChoiceField.

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

Upvotes: 16

mpen
mpen

Reputation: 283355

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


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

Upvotes: 6

Coc B.
Coc B.

Reputation: 665

Use this if you want the horizontal renderer.

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

Upvotes: 2

Related Questions