Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MultiValueDictKeyError in django modelformset_factory

I'm trying to imeplement an edit formset. Then, i'm instancing the objects in the formset using modelformset_factory. When the request isn't POST, the formset loads perfectly, but, if the request is POST, the formset constructor raises a MultiValueDictKeyError.

This is my code.

forms.py

class SchoolSectionForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_tag = False

        self.helper.layout = Layout(
            Div(
                'name',
                css_class='name',
            ),
        )

        super(SchoolSectionForm, self).__init__(*args, **kwargs)

    class Meta:
        model = SchoolSection

        exclude = [
            'school',
            'created_by',
        ]


class SectionBreakFormSet(BaseFormSet):

    def __init__(self, *args, **kwargs):
        super(SectionBreakFormSet, self).__init__(*args, **kwargs)


class SectionBreakForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_tag = False

        self.helper.layout = Layout(
            Div(
                Div(
                    'start_time',
                    css_class='start_time',
                ),
                Div(
                    'end_time',
                    css_class='end_time',
                ),
            css_class='formset_element',
            )
        )

        super(SectionBreakForm, self).__init__(*args, **kwargs)

    class Meta:
        model = SectionBreak

        exclude = [
            'school_section',
            'created_by',
        ]

views.py

def school_section_edit(request, section_id):

    section = get_object_or_404(
        SchoolSection,
        id=section_id,
    )

    current_school = request.user.current_school
    school_sections_list = current_school.schoolsection_set.all()

    section_break_formset = modelformset_factory(
        SectionBreak,
        max_num=3,
        extra=0,
        form=SectionBreakForm,
    )

    formset_qset = SectionBreak.objects.filter(school_section=section)

    formset = section_break_formset(queryset=formset_qset)
    school_section_form = SchoolSectionForm(instance=section)

    if request.method == 'POST':
        school_section_form = SchoolSectionForm(request.POST)

        # Bug raises in this line
        formset = section_break_formset(request.POST, queryset=formset_qset) 
        # Bug raises in this line


        if school_section_form.is_valid() and formset.is_valid():

            school_section_form.save()
            formset.save()

            messages.success(
                request,
                u'xxx',
            )

            return HttpResponseRedirect(reverse('school:school_section_add'))

        else:
            messages.error(
                request,
                u'xxx',
            )

    return render(request, 'school/schoolsection_add.html', {
        'school_section_form': school_section_form,
        'formset': formset,
        'school_sections_list': school_sections_list,
    })

template

<form class="new_section_form" method="post" action="">
    <div class="school_section_form">
        {% crispy school_section_form %}
    </div>

    <h3>Horarios de descanso:</h3>

    <div class="section_break_formset">
        {% crispy formset formset.form.helper %}
    </div>

    <button class="button color">guardar</button>
</form>

When i post the form... crashh.... i have this error

enter image description here

thanks for help...

Exception Type: MultiValueDictKeyError at /administrador/ciclo-educativo/editar/34/ Exception Value: "Key u'form-0-id' not found in <>QueryDict: {u'name': [u'Primaria'], u'form-MAX_NUM_FORMS': [u'3'], u'form-TOTAL_FORMS': [u'1'], u'form-0-start_time': [u'07:00:00'], u'form-0-end_time': [u'12:00:00'], u'form-INITIAL_FORMS': [u'1'], u'csrfmiddlewaretoken': [u'aZkZPJ6tlzJeCd1kjC0EpkjPuFbWe6IB', u'aZkZPJ6tlzJeCd1kjC0EpkjPuFbWe6IB']}<>"

like image 530
Andrés Quiroga Avatar asked Apr 12 '13 20:04

Andrés Quiroga


2 Answers

You might need to add the form id {{ form.id }} e.g. {% crispy formset formset.form.id %}

like image 99
Emil B. Kjer Avatar answered Oct 16 '22 15:10

Emil B. Kjer


Form id is hidden field but if you not include it in form in your template then it will through the above error. if include it in your template you will get rid of above error

Ex:
{{form.title}}  #this field you want to display
{{ form.id }}   # this is hidden field, this will not get display in form. but at the time of form-set submission this is required.
like image 37
Wagh Avatar answered Oct 16 '22 14:10

Wagh