9

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

这是我的代码。

表格.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',
        ]

视图.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>

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

在此处输入图像描述

感谢帮助...

异常类型:MultiValueDictKeyError at /administrador/ciclo-educativo/editar/34/ 异常值:“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']}<> "

4

2 回答 2

26

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

于 2013-05-08T23:16:16.773 回答
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.
于 2015-04-01T06:55:59.703 回答