そのため、以前の質問に対する回答の実装に取り組んでいます。
これが私のモデルです:
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())
変異原性に何か問題がありますか、それとも間違っていますか?
判じ絵の答えの後
次のように、クラス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'])
)。