为什么我的 Django 表单一直显示 "this field is required"

Why does my Django form keep saying "this field is required"

有谁知道为什么我的表单(文件选择器)在更简单的版本中工作时不断返回 "this field is required"?

我的观点是

def add_attempt(request, m_id, a_id):
    template = loader.get_template('add_attempt.html')
    if request.method == 'POST':
        import pprint 
        pprint.pprint(request.POST)
        pprint.pprint(request.FILES)
        form = UploadAttemptForm(data=request.POST, files=request.FILES)
        if form.is_valid():
            form.instance.pub_date = datetime.datetime.now()
            form.instance.user_id = request.user
            form.instance.assignment = m.Assignment.objects.get(id=a_id)
            form.save()
            return HttpResponseRedirect(reverse('assignment', args=(m_id, a_id)))
        else:
            print form.errors
    else:
        form = UploadAttemptForm()
    context = RequestContext(request, 
        {
        'form':form,
        })
    return HttpResponse(template.render(context))

我的模特是

class Attempt(models.Model):
    user_id = models.ForeignKey(User)
    pdf_filename = models.FileField(storage=settings.S3_STORAGE, upload_to='pdfs')
    pub_date = models.DateTimeField('date uploaded')
    assignment = models.ForeignKey(Assignment)

我的表格是

class UploadAttemptForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(UploadAttemptForm, self).__init__(*args, **kwargs)

    class Meta():
        model = Attempt
        fields = ['pdf_filename',]

错误打印为

`<QueryDict: {u'submit': [u'Upload Attempt'], u'pdf_filename': [u'something.pdf']}>`

<MultiValueDict: {}> <ul class="errorlist"><li>pdf_filename<ul class="errorlist"><li>This field is required.</li></ul></li></ul>

如果您的 models.py 中需要该字段(即您没有说明 blank=Truenull=True),并且您使用的是 ModelForm,那么这将成为 ModelForm

中的必填字段

添加我的评论作为正确答案:

请尝试将 enctype= multipart/form-data 添加到模板文件中的 <form> 元素。

如果您没有此元素,您的 request.FILES 将始终为空。

https://docs.djangoproject.com/en/1.7/topics/http/file-uploads/#basic-file-uploads 复制:

Note that request.FILES will only contain data if the request method was POST and the <form> that posted the request has the attribute enctype="multipart/form-data". Otherwise, request.FILES will be empty.