Django文件字段更新导致错误,即使不是必需的

时间:2016-05-11 19:31:17

标签: python django django-views

我有一个应用程序,用于更新模型的某些字段。有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)

2 个答案:

答案 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')