首页 > 解决方案 > 加载多个模型表单 django 时出现“ManagementForm 数据丢失或已被篡改”错误

问题描述

视图.py

@login_required(login_url='/account/login/')
def TaskCreateView(request,pk,todo_id):
    if not request.user.is_authenticated:
       return redirect('accounts:index')
    else:
       instance = get_object_or_404(Level, pk=pk)
       qs = instance.todo_set.get(id = todo_id)

    todo = Task.objects.filter(todo=qs, student=request.user)
    if todo.exists():
       messages.warning(request, 'You Already Completed This Task')
       return HttpResponseRedirect(instance.get_absolute_url())
    form = StudentTaskForm(request.POST or None, request.FILES or None)

    if form.is_valid():
        form.instance.user = User.objects.get(id=request.user.id)
        obj = form.save(commit=False)
        obj.student = request.user
        obj.todo = qs
        obj.level = instance
        obj.save()

    ImageFormSet = modelformset_factory(Images,
                                        form=ImageForm, extra=3)
    formset = ImageFormSet(request.POST, request.FILES,
                           queryset=Images.objects.none())
    if request.method == 'POST':
        if formset.is_valid():
            for form in formset.cleaned_data:
                image = form['image']
                photo = Images(post=form, image=image)
                photo.save()

            return redirect('student:dashboard')

    return render(request,'task_form.html', 
    {'form':form,"qs":qs,'formset':formset})

表格.py

class StudentTaskForm(forms.ModelForm):
    title = forms.CharField(widget=forms.TextInput(attrs={'class': 
    'form-control',' type': "text",'placeholder':'Enter Title'}))
    content = forms.CharField(widget=SummernoteWidget())


    class Meta:
        model = Task
        fields = [
            'title',
            'content',
        ]
        widgets = {
            'content': SummernoteWidget(),
        }

class ImageForm(forms.ModelForm):
    image = forms.ImageField(label='Image')
    class Meta:
        model = Images
        fields = ('image', )

我有两个模型任务和图像,我使用两种形式。我试图为同一个实现多个图像上传。当我尝试加载表单时,我遇到了这个错误。我已经{{ formset.management_form }}在模板中添加了。图像模型具有任务的外键。

模板:

<form id="post_form" action="" method="post" 
     enctype="multipart/form-data">
      {% csrf_token %}
    {% for hidden in form.hidden_fields %}
      {{ hidden }}
     {% endfor %}

  {% for field in form %}
    {{ field }} <br />
   {% endfor %}


{{ formset.management_form }}
{% for form in formset %}

    {{ form }}
  {% endfor %}
  <div class="panel-body">
  <button type="submit" class="btn btn-primary m-t-10">Submit</button>
 </div>
</form>

标签: pythondjangodjango-forms

解决方案


您应该只request.POST为 POST 请求实例化表单集。

if request.method == 'POST':
    formset = ImageFormSet(request.POST, request.FILES,
                           queryset=Images.objects.none())
    ...
else:
    # GET request
    formset = ImageFormSet(queryset=Images.objects.none())
...

推荐阅读