django modelformset_factory中的MultiValueDictKeyError

时间:2013-04-12 20:39:23

标签: django django-forms

我正在尝试修改编辑formset。然后,我使用modelformset_factory实例化formset中的对象。当请求不是POST时,formset加载完美,但是,如果请求是POST,则formset构造函数会引发MultiValueDictKeyError。

这是我的代码。

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,
    })

模板

<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>

当我发布表格时......崩溃......我有这个错误

enter image description here

感谢您的帮助...

异常类型:/ administrador / ciclo-educativo / editar / 34 /中的MultiValueDictKeyError 例外值:在&lt;&gt; QueryDict中找不到“密钥u'form-0-id”:{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']}&lt;&gt;“

2 个答案:

答案 0 :(得分:25)

您可能需要添加表单ID {{ form.id }},例如 {% crispy formset formset.form.id %}

答案 1 :(得分:6)

表单ID是隐藏字段,但如果您不在表单中包含它,那么它将通过上述错误。 如果将其包含在您的模板中,您将摆脱上述错误

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.