我有一个应用程序,用于更新模型的某些字段。有4个可能的字段可以更新:resolution,upload4,upload5和upload6。上传字段不是必需的。如果我不包含request.FILES行,上传的文件将不会保存到数据库,但似乎因为我已经包含它,我需要总是上传3个文件,即使它们不是必需的。我得到的例外是POST上的“MultiValueDictKeyError”。我怎样才能解决这个问题?我想要添加3个文件的选项,但我不想每次都这样。我理解如何创建一个不需要的字段,我不知道如何编写request.FILES以了解它不是必需的。
views.py
@login_required(login_url='/login/')
def report(request, case_id):
form = ReportForm()
case = get_object_or_404(Incident, pk=case_id)
# if this is a POST request we need to process the form data
if request.POST:
# create a form instance and populate it with the data from the request:
form = ReportForm(request.POST)
if form.is_valid():
resolution = (form.cleaned_data['resolution']) # grabbing action_taken from user input
case.resolution = resolution
case.upload4 = request.FILES['upload4']
case.upload5 = request.FILES['upload5']
case.upload6 = request.FILES['upload6']
case.status = Status.objects.get(status='closed')
case.save(update_fields=['resolution', 'status', 'upload4', 'upload5', 'upload6'])
context = { 'case': case,
'form': form}
return HttpResponseRedirect(reverse('dashboard_app:dashboard'))
template = "report.html"
#form = CaseForm()
context = { 'case': case,
'form': form}
return render(request, template, context)
答案 0 :(得分:1)
关键是你忽略了表单所做的验证,并直接回到请求中的数据。所以,是的,如果表格不存在,那将会破裂。但这正是我们使用表格的原因。
case.upload4 = form.cleaned_data['upload4']
等
如果你使用ModelForm会更容易;然后,您可以将case
作为表单的instance
参数传递,然后执行form.save()
,替换is_valid
块中的几乎所有代码。
答案 1 :(得分:0)
这将解决问题。
case.upload4 = request.FILES.get('upload4')
case.upload5 = request.FILES.get('upload5')
case.upload6 = request.FILES.get('upload6')