2010-05-09 100 views
4

我有這樣一個模型:處理文件上傳保存

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) 

我想保存已上傳的文件是一個MP3,這樣之前驗證:

def is_mp3(path_to_file): 
    from mutagen.mp3 import MP3 
    audio = MP3(path_to_file) 
    return not audio.info.sketchy 

一旦我確定我已經有了MP3,我想要將這段談話的長度保存在seconds屬性中,如下所示:

audio = MP3(path_to_file) 
self.seconds = audio.info.length 

p在保存之前,上傳的文件沒有路徑(參見this ticket,關閉爲wontfix),所以我無法處理MP3。

我想提出一個很好的驗證錯誤,以便ModelForm s可以顯示一個有用的錯誤(「你這個白癡,你沒有上傳MP3」或什麼的)。

任何想法如何在保存之前訪問文件?

p.s.如果有人知道更好的驗證文件的方式是MP3,那麼我都很喜歡 - 我也希望能夠處理ID3數據(設置藝術家,專輯,標題和專輯封面,所以我需要它可以通過mutagen)。

回答

8

您可以在您的視圖中訪問request.FILES中的文件數據。

我認爲最好的辦法是bind uploaded files to a form,覆蓋形式clean method,得到cleaned_data的UploadedFile object,驗證它反正你喜歡,然後覆蓋save method,並與有關文件的信息來填充你的模型實例,然後將其保存。

+1

+1和接受!這似乎是要走的路 - 似乎有點遺憾,沒有一種使用新型模型驗證的優雅方法。 – 2010-05-10 15:04:13

+0

也許你可以,但它是相當新的,我還不夠熟悉。 – 2010-05-10 15:12:10

1

更清潔的方式來獲得之前保存的文件是這樣的:

from django.core.exceptions import ValidationError 

#this go in your class Model 
def clean(self): 
    try: 
     f = self.mp3.file #the file in Memory 
    except ValueError: 
     raise ValidationError("A File is needed") 
    f.__class__ #this prints <class 'django.core.files.uploadedfile.InMemoryUploadedFile'> 
    processfile(f) 

,如果我們需要一個路徑,療法答案是in this other question