在保存对象之前处理文件上载

Dom*_*ger 5 django django-models django-file-upload

我有一个这样的模型:

class Talk(BaseModel):
  title        = models.CharField(max_length=200)
  mp3          = models.FileField(upload_to = u'talks/', max_length=200)
  seconds      = models.IntegerField(blank = True, null = True)
Run Code Online (Sandbox Code Playgroud)

我想在保存之前验证上传的文件是MP3,如下所示:

def is_mp3(path_to_file):
  from mutagen.mp3 import MP3
  audio = MP3(path_to_file)
  return not audio.info.sketchy
Run Code Online (Sandbox Code Playgroud)

一旦我确定我有一个MP3,我想在seconds属性中保存通话的长度,如下所示:

audio = MP3(path_to_file)
self.seconds = audio.info.length
Run Code Online (Sandbox Code Playgroud)

问题是,在保存之前,上传的文件没有路径(请参阅此票证,关闭为wontfix),因此我无法处理MP3.

我想提出一个很好的验证错误,以便ModelForms可以显示一个有用的错误("你这个白痴,你没有上传MP3"或其他东西).

知道如何在保存文件之前访问该文件吗?

ps如果有人知道验证文件的更好方法是MP3,我会全神贯注 - 我也希望能够搞乱ID3数据(设置艺术家,专辑,标题和专辑艺术,所以我需要它可以处理通过mutagen).

Dav*_*cic 9

您可以在视图中访问request.FILES中的文件数据.

我认为最好的方法是将上传的文件绑定到表单,覆盖表单clean方法,从cleaning_data 获取UploadedFile对象,无论如何都要验证它,然后覆盖 save方法并使用有关该文件的信息填充模型实例,然后保存.