Django表示:当文件POST到文件字段时,“此字段是必需的”

时间:2015-11-24 10:35:17

标签: django forms

我出于某种原因无法将文件存入我的ModelForm中的文件字段。文件已提交且文件名在相应的POST请求中,但form.is_valid()失败,因为它指出{'the_file': [u'This field is required.']}

我为一个带有文件字段的模型和另一个模型的外键编写了一个ModelForm,因此:

class AccountFile(models.Model):
the_file = models.FileField(upload_to='{}/%Y/%m/%d/'.format(
    settings.MEDIA_ROOT,
))
account = models.ForeignKey(
    Account,
    blank=True,
    null=True,
    related_name='account_files'

然后我生成了一个表单来上传文件,因此:

class UploadFileForm(forms.ModelForm):
class Meta:
    model = models.AccountFile
    fields = ['the_file' ]


def clean_file(self):
    file = self.cleaned_data.get("the_file", False)
    filetype = magic.from_buffer(file.read())
    if not "pdf" in filetype:
        raise forms.ValidationError("File is not pdf.")
    return file

当我至少可以使用一件事时,进行一些非常基本的验证(将会延长!)。

表单的处理方式如下:

if request.method == 'POST':
    form = forms.UploadFileForm(request.POST, request.FILES)
    if form.is_valid():
        handle_uploaded_file(request.FILES['file'])
        return redirect(
            'account_url',
            acc_manager_pk=acc_manager.pk,
            account_pk=account.pk,
            )
else:
    form = forms.UploadFileForm()

这是关于Django 1.7

1 个答案:

答案 0 :(得分:23)

确保您的表单设置了enctype,例如:

<form method="post" enctype="multipart/form-data">

来自the docs

  

请注意,如果请求方法为 POST request.FILES 将仅包含数据,并且发布请求的<form>具有属性 enctype = “多部分/格式数据”即可。否则, request.FILES 将为空。