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

Dav*_*ton 16 forms django

我出于某种原因无法在我的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'
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

当我至少可以完成一件事时,进行一些非常基本的验证(将会扩展!).

表单处理如下:

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()
Run Code Online (Sandbox Code Playgroud)

这是在Django 1.7上

Ala*_*air 33

确保您的表单具有该enctype集合,例如:

<form method="post" enctype="multipart/form-data">
Run Code Online (Sandbox Code Playgroud)

来自文档:

请注意,如果请求方法是POST,则request.FILES将仅包含数据,并且发布请求的请求具有属性enctype ="multipart/form-data".否则,request.FILES将为空.<form>

  • 非常感谢!我已经阅读了该页面大约十次,在第一次阅读时看到了该页面,但随后在其他所有阅读中都错过了,以找出我错过的内容。继续下一个错误! (2认同)