Chidananda Nayak
Chidananda Nayak

Reputation: 1201

How to display choices as checkboxes in django?

I have a model which i am overriding in forms.py and displaying in frontend. So choices field is coming as drop down but i want it to render as checkbox, i tried to do so by overriding in form with forms.CheckBoxInput() but its just showing checkbox for region hot for its respective options.so can please guide me how to achieve it.

models.py

region_choices = (
    ('AF', 'Africa'),
    ('AS', 'Asia'),
    ('EU', 'Europe'),
    ('NA', 'North America'),
    ('SA', 'South America'),
    ('OC', 'Oceania'),
    ('AN', 'Antarctica'),
)

class Registeration(models.Model):
    username = models.CharField(max_length=100)
    email = models.EmailField()
    password = models.CharField(max_length=100)
    confirm_pasword = models.CharField(max_length=100)
    region = models.CharField(choices=region_choices,max_length=10)
    terms_confirmed = models.BooleanField(default=False)


    def __str__(self):
        return self.username

forms.py

class RegistrationForm(forms.ModelForm):

    def __init__(self,*args,**kwargs):
        super(RegistrationForm,self).__init__(*args,**kwargs)
        self.fields['region'].widget = forms.CheckboxInput()


    class Meta:
        model = Registeration
        fields = '__all__'

html

<form>
    {% csrf_token %}
    {{form.as_p}}
    <input type="submit" value="ok">
</form>

Upvotes: 1

Views: 3180

Answers (1)

Sreekanth Reddy Balne
Sreekanth Reddy Balne

Reputation: 3424

You could use the forms.MultipleChoiceField with widget=forms.CheckboxSelectMultiple().

class RegistrationForm(forms.ModelForm):

    region = forms.MultipleChoiceField(choices=region_choices, widget=forms.CheckboxSelectMultiple())

    def clean_region(self):
        if len(self.cleaned_data['region']) > 1:
            raise forms.ValidationError('Select only 1 option.')
        return self.cleaned_data['region']

    class Meta:
        model = Registeration
        fields = '__all__'

or

class RegistrationForm(forms.ModelForm):

    def __init__(self,*args,**kwargs):
        super(RegistrationForm,self).__init__(*args,**kwargs)
        self.fields['region']= forms.MultipleChoiceField(choices=region_choices, widget=forms.CheckboxSelectMultiple())

    def clean_region(self):
        if len(self.cleaned_data['region']) > 1:
            raise forms.ValidationError('Select only 1 option.')
        return self.cleaned_data['region']

    class Meta:
        model = Registeration
        fields = '__all__'

Upvotes: 2

Related Questions