使用modelformsets时管理表单错误('管理表单数据丢失或已被篡改')

6 投票
2 回答
4913 浏览
提问于 2025-04-16 01:06

我有一个名为 models.py 的类,内容如下:

class Educational_Qualification(models.Model):
   user = models.ForeignKey(User)
   exam = models.CharField(max_length=40)
   pass_month = models.CharField(max_length=40)

我还有一个名为 views.py 的文件,内容如下:

def create_qualification(request):
 QFormSet = modelformset_factory(Educational_Qualification, extra=3, exclude=("user",))
 if request.method == "POST":
  formset = QFormSet(request.POST, request.FILES)

  if formset.is_valid():
   formset.save()
   for form in formset.forms:
    if form.is_valid():
     quali= form.save(commit=False)
     quali.user = request.user
     quali.save()

    return HttpResponse("Saved")
  else:
   return HttpResponse("Snafu")
 else:
  formset = QFormSet()
 return render_to_response("register/edu.html", {"formset":formset}, context_instance=RequestContext(request)) 

当我提交表单时,出现了一个验证错误,提示说“缺少 ManagementForm 数据或数据被篡改”。

我在我的模板中有 formset.management_form。

这可能是什么问题呢?

2 个回答

0

如果有多个视图(也就是页面上的不同部分)在一起工作,而其中一个视图不知道表单的前缀,这种情况也会发生。

获取视图:

def someview(request):
...
    formset = Formset(prefix="foo")
...

提交视图(可能是一个处理Ajax表单提交的程序):

def ajaxview(request):
...
    formset = Formset(request.POST, prefix="foo")  # here
...
25

这个错误不是出在你的视图或模型上,而是在模板里。

正确的方式来显示表单组是:

<form method="post" action="">
    <table>
        {{ formset }}
    </table>
</form>

或者

<form method="post" action="">
    {{ formset.management_form }}
    <table>
        {% for form in formset.forms %}
            {{ form }}
        {% endfor %}
    </table>
</form>

我想,你可能在模板中循环显示表单时,没有包含管理表单吧?

撰写回答