michel.iamit
michel.iamit

Reputation: 5916

Crispy form render manytomanyfield as checkboxes

I have a manytomany object in a model form which I want to be rendered as select fields under each other, but whatever I try, i keep getting them next to each other with crispy django forms

class ContactForm(forms.ModelForm):
    choice = forms.ModelMultipleChoiceField(label=_('Request'),        widget=forms.CheckboxSelectMultiple(),required=False,
                                        queryset=ContactFormChoices.objects.all())
    name = forms.CharField(label=_('Name'))
    email = forms.EmailField(required=False, label=_('E-mail'))
    phone_number = forms.CharField(required=False, label=_('Phone number'))
    message = forms.CharField( widget=forms.Textarea , label=_('Message'))

    def __init__(self, *args, **kwargs):
        super(ContactForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_class = 'form-horizontal'
        self.helper.layout = Layout(
            Field('name', css_class='input-xlarge'),
            Field('email', css_class='input-xlarge'),
            Field('phone_number', css_class='input-xlarge'),
            Field('message', rows="3", css_class='input-xlarge'),
           #'choice',
            Field('choice'),
            FormActions(
                Submit('submit', _('Submit'), css_class="btn-primary")
            )

        )

    class Meta:
        model = ContactData
        fields = ['name','message','email','phone_number','choice']

and the model:

class ContactFormChoices(models.Model):
    '''
    The contact form options to show
    '''
    text = models.CharField(max_length=256)
    active = models.BooleanField(default=True)

    def __unicode__(self):
        return self.text

class ContactData(models.Model):
    '''
    The contact data (when customer fills in the contact form,
     this is mailed and saved here
    '''
    name = models.CharField(max_length=256,help_text=_("Name"))
    phone_number= models.CharField(max_length=256,null=True,blank=True,default=None)
    email = models.EmailField(max_length=256,null=True,blank=True,default=None)
    choice = models.ManyToManyField(ContactFormChoices,blank=True,default=None)
    message = models.TextField()

    def __unicode__(self):
        return self.name

it looks like this: the form horizontal checkboxes in stead of vertical

Anybody any suggestion?

Upvotes: 1

Views: 2261

Answers (1)

michel.iamit
michel.iamit

Reputation: 5916

wow, after searching and trying a lot.... the answer seem to be very simple:

helper.layout = Layout(
        Field('name', css_class='input-xlarge'),
        Field('email', css_class='input-xlarge'),
        Field('phone_number', css_class='input-xlarge'),
        Field('message', rows="3", css_class='input-xlarge'),
        PrependedText('choice', ''),
        FormActions(
            Submit('submit', _('Submit'), css_class="btn-primary")
        )
    )

and partly duplicate to this question and answer: BooleanField checkbox not render correctly with crispy_forms using bootstrap

Upvotes: 3

Related Questions