python - 加载多个模型表单 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>
解决方案
您应该只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())
...
推荐阅读
- arrays - 以最好的顺序和最快的时间找到一个特殊数组的峰值
- r - 删除具有重叠时间的行的有效方法
- angular - Angular无法初始化变量
- java - C++ 与 Java 中传递的函数参数
- c# - 我如何知道 SQL Server 连接在 C# winforms 中丢失
- reactjs - 如何在本机反应中为 TextInput 的值设置多种颜色
- eclipse - OpenChrom - IDE 用户产品未在 Eclipse 安装程序简单模式下显示
- c - C中的多线程字数
- swift - 关于线程 1:致命错误:在隐式展开可选值时意外发现 nil
- java - 在 Twitter 登录后 response.sendRedirect() 不会重定向到回调