Reputation: 87225
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
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
Reputation: 600059
Use TypedChoiceField
.
class EmailEditForm(forms.ModelForm):
to_send_form = forms.TypedChoiceField(
choices=choices, widget=forms.RadioSelect, coerce=int
)
Upvotes: 16
Reputation: 283355
field = BooleanField(widget=RadioSelect(choices=YES_OR_NO), required=False)
YES_OR_NO = (
(True, 'Yes'),
(False, 'No')
)
Upvotes: 6
Reputation: 665
Use this if you want the horizontal renderer.
http://djangosnippets.org/snippets/1956/
Upvotes: 2