Question

Hi Stackoverflow people,

I would like to style a formset with the crispy app, but it causes some grieve.

A very simple model should be presented four times.

class ItemPicture(models.Model):
    item = models.ForeignKey('Item')
    picture = ThumbnailerImageField(_('Image'),
            upload_to='pictures/', null=True, blank=True,)

The form class is also straightforward:

class ItemPictureForm(forms.ModelForm):
    class Meta:
        model = ItemPicture
        fields = ('picture',)

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_tag = False
        self.helper.layout = Layout(
                Fieldset(_('Add pictures'),'picture', ),
                ButtonHolder(
                    Submit('save', _('Add'), css_class='btn btn-primary '),
                    Reset('reset', _('Cancel'), css_class='btn')))
        super(ItemPictureForm, self).__init__(*args, **kwargs)

In my views.py, I generate the formset:

class ItemUploadPictures(FormView):
    ItemPictureFormSet = formset_factory(ItemPictureForm, extra=4)
    form_class = ItemPictureFormSet
    template_name = 'item_upload_pictures.html' 
    success_url = reverse_lazy('dashboard') 

My trouble is that crispy expects {% crispy formset formset.form.helper %} in the template, but it seems that the passed-through variable is form. {% crispy form %} works, but no helper attributes will be displayed. How can I pass the entire formset information to the template?

Thank you for your suggestions.

Was it helpful?

Solution

OTHER TIPS

Have you tried

{% crispy formset form.form.helper %}

forms.py

class ItemPictureForm(forms.ModelForm):
    class Meta:
        model = ItemPicture
        fields = ('picture',)

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_tag = False
        self.helper.layout = Layout(
                Fieldset(_('Add pictures'),'picture', ),
        # These need to be removed because they cant be prevented from duplicating
        #       ButtonHolder(
        #           Submit('save', _('Add'), css_class='btn btn-primary '),
        #           Reset('reset', _('Cancel'), css_class='btn')
        ))
        super(ItemPictureForm, self).__init__(*args, **kwargs)

manage_pictures.html

{% load crispy_forms_tags i18n %}
<form action="" method="post">
    {% csrf_token %}
    {% crispy formset formset.form.helper %}
    <div class="form-actions">
        <input type="submit" name="save" value="{% trans "Add" %}" class="btn btn-primary" id="submit-id-save"> 
        <input type="button" name="reset" value="{% trans "Cancel" %}" class="btn" id="button-id-cancel">
    </div>
</form>
{% crispy formset formset.form.helper %}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top