Reputation: 1201
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
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