所以,我正在实现对我的先前问题的答案。
这是我的模型:
class Talk(models.Model):
title = models.CharField(max_length=200)
mp3 = models.FileField(upload_to = u'talks/', max_length=200)
这是我的表单:
class TalkForm(forms.ModelForm):
def clean(self):
super(TalkForm, self).clean()
cleaned_data = self.cleaned_data
if u'mp3' in self.files:
from mutagen.mp3 import MP3
if hasattr(self.files['mp3'], 'temporary_file_path'):
audio = MP3(self.files['mp3'].temporary_file_path())
else:
# What goes here?
audio = None # setting to None for now
...
return cleaned_data
class Meta:
model = Talk
Mutagen需要文件类对象或者在磁盘上的文件名(我认为)- 第一种情况(上传的文件大于内存中可处理的文件大小)可以正常工作,但是我不知道如何处理InMemoryUploadedFile
得到的其他情况。我尝试过:
# TypeError (coercing to Unicode: need string or buffer, InMemoryUploadedFile found)
audio = MP3(self.files['mp3'])
# TypeError (coercing to Unicode: need string or buffer, cStringIO.StringO found)
audio = MP3(self.files['mp3'].file)
# Hangs seemingly indefinitely on my test file (~800KB)
audio = MP3(self.files['mp3'].file.read())
mutagen是否有问题,还是我的操作有误?
在rebus的回答之后
在我的ModelAdmin
类中像这样实时修改FILE_UPLOAD_HANDLERS
设置:
def add_view(self, request, form_url='', extra_context=None):
request.upload_handlers = [TemporaryFileUploadHandler()]
return super(TalkAdmin, self).add_view(request, form_url, extra_context)
当我点击提交按钮时,出现了500错误:
在上传处理完成后,您无法设置上传处理程序。
尽管我尽可能早地设置了它!
此外,我不确定我是否在返回的对象中有一个save
方法(我已经查看了dir(self.files['mp3'].file)
和dir(self.files['mp3'])
)。
ModelAdmin
定义中对这两个视图进行子类化。http://docs.djangoproject.com/en/dev/ref/contrib/admin/#other-methods - Davor Lucicdefault_storage
的东西,但如果不起作用,我很乐意关闭MemoryFileUploadhandler
。再次感谢! - Dominic Rodger