2011-01-31 82 views
1

我試圖創建一種'媒體管理器'模型,它將允許用戶上傳不同的國王媒體(圖像,swfs,pdfs)類似於WordPress的方式。我的媒體模式看起來是這樣的:Django - FileField和圖像

class Media(models.Model): 
    id = models.AutoField(primary_key=True) 
    url = models.FileField(upload_to="uploads") 
    mimetype = models.CharField(max_length=64, editable=False) 
    created = models.DateTimeField(auto_now_add=True, editable=False) 

當用戶上傳文件,我想先確定它是什麼樣的文件,如果它是一個形象,進一步對其進行操作。我希望能夠通過視圖指定上傳圖像的尺寸(裁切),所以當我調用.save()方法時,模型將調整大小並裁剪圖像,上傳並使用url填充數據庫到文件。

我也想確保上傳的圖像是在後期處理(裁剪等)後完成的,我沒有必要保留原始文件。

所以我問的問題是如何將參數傳遞給FileFields保存方法(所以我可以傳遞動態屬性進行圖像後期處理),以及如何確保後處理完成後的圖像上傳?

編輯:當我說在上傳圖片之前,我的意思是在它被保存到它的最終目的地之前。我知道圖像必須首先進入tmp文件夾,然後才能發佈它。對於誤導性問題抱歉。

希望有人能幫助:)

回答

4

圖像上傳之前你不能做任何事情(因爲你什麼都沒有一起工作)。

但是如果你想將其保存到數據庫之前修改圖像,你可以在模型的save做()方法​​,調用父的save()

如果您是通過管理員上傳,重寫方法save_model(前)在admin.py中,即:

def save_model(self, request, obj, form, change): 

     file = request.FILES.get('url') # name of field 
     if file: 
      # proceed your code 

     return super(AdminClassName, self).save_model(request, obj, form, change) 
+0

@tovmeod +1對於用戶名 – AllTradesJack 2014-07-29 23:21:21

1

在圖像上傳之前如何處理?這沒有意義。直到您上傳文件,服務器才能訪問該文件。

如果您確實想在保存文件之前處理該文件,則可以編寫一個custom upload handler。您可以在此處測試該文件是否爲圖像,然後在保存前適當裁剪。 (你需要Python Imaging Library來完成這兩項任務。)

+0

您可以在內存中編輯它。檢查InMemoryUploadedFile – errx 2011-01-31 12:10:08

2

這是我的代碼,在實際上傳之前如何更改文件。我想你應該讓我的想法

from django.core.files.uploadedfile import InMemoryUploadedFile 
#.... 
#some form 
     def clean_avatar(self): 
      av = self.cleaned_data['avatar'] 
      resized = make_avatar(av,65) # My custom function than returns image 
      return InMemoryUploadedFile(resized, av.field_name, av.name, av.content_type, resized.len, av.charset) 

您可以閱讀InMemoryUploadedFile「文檔」 Django的代碼。 而在您的調整大小/裁剪功能,你應該使用StringIO不文件來保存結果