开发者

Management form error while using modelformsets ('ManagementForm data is missing or has been tampered with')

开发者 https://www.devze.com 2023-01-06 21:04 出处:网络
I have a models.py class as below class Educational_Qualification(models.Model): user = models.ForeignKey(User)

I have a models.py class as below

class Educational_Qualification(models.Model):
   user = models.ForeignKey(User)
   exam = models.CharField(max_length=40)开发者_StackOverflow社区
   pass_month = models.CharField(max_length=40)

I have a views.py as below

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

When I submit the form, it throws up the validation Error. stating that ManagementForm data is missing or has been tampered with'

I have formset.management_form in my template.

What could be the issue?


The error is not in your views or the models, but in the templates.

The right way to render the formset, is:

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

or

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

I guess, you are looping over the forms in the templates without including the management form?


It also happens if there are multiple views involved and one of them is not aware of the formset prefix.

Get view:

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

Post view (Potentially an Ajax form submit handler):

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号