Итак, я работаю над реализацией ответа на мой предыдущий вопрос .
Вот моя модель:
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
Мутагену нужны файловые объекты или имена файлов на диске (я думаю ) - первый случай (когда размер загружаемого файла превышает размер файла, обрабатываемого в памяти) хорошо, но я не знаю, как справиться с 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())
Что-то не так с мутагеном, или я делаю это неправильно?
После ответа ребуса
Изменение настройки FILE_UPLOAD_HANDLERS
на лету в моем классе ModelAdmin
следующим образом:
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'])
).