嵌套的Django表单:“ ManagementForm数据丢失或已被篡改”

Jam*_*mes 3 html python forms django nested-forms

因此,我环顾四周,似乎没有人遇到相同的问题,不得不引起这个看似常见的错误。我在我的html中呈现一些表单,如下所示:

<form method="post" action="">
{{ tags_formset.management_form }}

<!-- code displaying this formset -->
...
<!-- -->

    <form method="post" action="">
        {{ add_all_form.management_form }}
        {{ add_all_form.addTagsToAll }}
        <input type="submit" value="Add To Displayed Applicants" />
    </form>

    <form method="post" action="">
        {{ remove_all_form.management_form }}
        {{ remove_all_form.removeTagsFromAll }}
        <input type="submit" value="Remove From Displayed Applicants" />
    </form>
    <input type="submit" value="Save Changes" />
</form>
Run Code Online (Sandbox Code Playgroud)

当我没有两个内部表单时,将正确显示表单集,并且“提交”按钮可以提交表单。当我添加第二种两种形式时,出现了几个问题:

-提交按钮停止工作(尽管在选择表单集的一个字段时按Enter仍提交表单

-add_all_form的提交工作正常,并且功能正常(不是问题,但有趣的是下一点...)

-remove_all_form无法通过“ ManagementForm数据丢失或已被篡改”验证错误来正常工作。

这是创建表单的views.py代码:

    TagsFormSet = formset_factory(TagsForm, formset=TagFormSet, extra=applicantQuery.count())
    if request.method == 'POST':
        tags_formset = TagsFormSet(request.POST, request.FILES, prefix='tags', applicants=applicantQuery)
        add_all_form = TagAddAllForm(request.POST, request.FILES, prefix='addForm', applicants=applicantQuery)
        remove_all_form = TagRemoveAllForm(request.POST, request.FILES, prefix='removeForm', applicants=applicantQuery)
        redirect = False
        if tags_formset.is_valid():
            for tagForm in tags_formset.forms:
                if 'tags' in tagForm.cleaned_data:
                    tagForm.saveTags()
                if 'removeTags' in tagForm.cleaned_data:
                    tagForm.deleteTags()                        
            redirect = True
        if add_all_form.is_valid():
            if 'addTagsToAll' in add_all_form.cleaned_data:
                add_all_form.saveTagsToAll()
            redirect = True
        if remove_all_form.is_valid():
            if 'removeTagsFromAll' in remove_all_form.cleaned_data:
                remove_all_form.deleteTagsFromAll()
            redirect = True
        if redirect:
            return http.HttpResponseRedirect('')
    else:
        initForms = []
        tags_formset = TagsFormSet(prefix='tags', applicants=applicantQuery)
        add_all_form = TagAddAllForm(prefix='addForm', applicants=applicantQuery)
        remove_all_form = TagRemoveAllForm(prefix='removeForm', applicants=applicantQuery)
Run Code Online (Sandbox Code Playgroud)

我从字面上无法弄清楚出了什么问题。我不知道为什么当remove_all_form不起作用时add_all_form可以工作,因为我基本上复制并粘贴了所涉及的所有内容(如果需要,我可以从Forms.py文件中发布代码,但我认为问题不存在。) )

请帮忙!

Aks*_*aaj 5

您应该只使用一个<form>标签。您可以在此处拥有任意数量的提交按钮,并可以显示任意数量的表单,但是所有表单都应位于单个<form>标记内。

然后,所有管理数据将以表单提交的形式正确发送,并且您的问题应得到解决。

<form method="post" action="">
{{ tags_formset.management_form }}

<!-- code displaying this formset -->
...
<!-- -->


    {{ add_all_form.management_form }}
    {{ add_all_form.addTagsToAll }}
    <input type="submit" value="Add To Displayed Applicants" />


>
    {{ remove_all_form.management_form }}
    {{ remove_all_form.removeTagsFromAll }}
    <input type="submit" value="Remove From Displayed Applicants" />
<input type="submit" value="Save Changes" />
Run Code Online (Sandbox Code Playgroud)

您的视图可以保持原样。