形式的清洁方法中读取文件中的数据
-
25-09-2019 - |
题
所以,我正在实施的答案我刚才的问题
下面是我的模型:
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
诱变剂需要类文件在磁盘上的对象或文件名(I < EM>认为的) - 第一种情况(其中上传的文件比文件在内存中处理的大小)工作正常大,但我不知道如何处理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'])
)。
解决方案
您可以尝试改变自己的 FILE_UPLOAD_HANDLERS 一>以这样的方式,以便Django的始终使用temporay文件处理程序:
FILE_UPLOAD_HANDLERS
默认:
("django.core.files.uploadhandler.MemoryFileUploadHandler",
"django.core.files.uploadhandler.TemporaryFileUploadHandler",)
所以,你可以通过在settings.py覆盖的设置,只留下TemporaryFileUploadHandler
。
修改强>
简单得多,应在第一个地方已经想到它:(:
from your.models import Talk
mp3 = self.files['mp3']
f = Talk.mp3.save('somename.mp3', mp3)
MP3(f.mp3.path)
>>> {'TRCK': TRCK(encoding=0, text=[u'5'])}
您可以保存InMemoryUploadedFile
到磁盘这种方式,然后使用路径,文件与mutagen
工作。
修改强>
没有一个模型实例同样的事情。
import os
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile
from django.conf import settings
from mutagen.mp3 import MP3
mp3 = request.FILES['mp3'] # or self.files['mp3'] in your form
path = default_storage.save('tmp/somename.mp3', ContentFile(mp3.read()))
MP3(os.path.join(settings.MEDIA_ROOT, path))
请注意,它的保存在MEDIA_ROOT文件,当我尝试将其保存在其他地方,我得到的 SuspiciousOperation 因为是有限制的,你可以写......你应该删除检查之后这个文件我想,真实的东西会在你的模型......
path = default_storage.delete('tmp/somename.mp3')
不隶属于 StackOverflow