2011-08-05 41 views
1

我有一個以下的Banner類。管理員可以編輯它。在Django中使用時,圖像字段相關的問題admin

class Banner(models.Model): 
    name  = models.CharField(max_length = 128) 
    link  = models.TextField(max_length = 450) 
    image  = models.ImageField(upload_to = 'banner_images') 

有兩個問題。

  1. 當保存圖像時,它與原始文件名一起保存。我想用一些唯一的名稱來改變它,以便在具有相同名稱的圖像再次上載到指定目錄時不會發生衝突。
  2. 更新圖像時,必須刪除第一個圖像文件。它不會發生...

任何建議將有所幫助。提前致謝。

+0

如果您找到解決方案,請將其作爲答案發布。我對這樣的事情也感興趣:) – Dracontis

+0

我不知道獲得解決方案的最佳方式......如果我不能在適當的時候得到答案,我將不得不鍛鍊我的解決方案,並且一定會把它放在這裏。 –

+1

我沒有時間去測試這個,但是用save_model()方法可以實現刪除圖像。它支持先前和過去的保存方法,因此您可以獲取圖像鏈接,調用通用保存方法,將數據重寫到數據庫中並保存新圖像,然後保存後,只需使用常用python方法刪除文件即可。或者只是將圖像與保存前保存的數據一起移除,然後保存模型。 – Dracontis

回答

1

嘗試這樣:

from os import rename 
class Banner(models.Model): 
    name  = models.CharField(max_length = 128) 
    link  = models.TextField(max_length = 450) 
    image  = models.ImageField(upload_to = 'banner_images') 

    def save(self): 
      super(Banner, self).save() 
      new_filename = <insert code here to change name> 
      self.image.name = new_filename 
      rename(static_path+'banner_images/'+self.image, static_path+'banner_images/'+new_filename) 
      super(Banner, self).save() 

我不知道如果超(橫幅,個體經營).save()調用時需要兩次或沒有。第一個可能需要保存文件,第二個可能需要更新數據庫記錄。

+0

圖像是'ImageFieldFile'對象。任何想法如何從中獲取文件名?另外,在你的例子中,你將失去文件擴展名。 – Dracontis

+0

好的,我編輯了它。希望這個作品... –

+0

謝謝你的建議。 –

0

因爲我是有問題關係到節約通過管理我得到了以下的解決方案,回答我的所有查詢的圖片的

  • 首先,我發現,即使管理員保留原來的文件名,如果有同名文件已經存在,它保持在例如,如果相同的文件上傳,它被存儲爲圖像,image_2,image_3等...

  • 其次,雖然通過管理更改圖像,它是一個後綴,以防止重複的文件名不刪除原始文件。爲此,我在admin.py中編寫了以下代碼。而且它的工作好...

代碼:

class BannerAdmin(admin.ModelAdmin): 

    def save_model(self, request, obj, form, change): 
     #Remove the previous file if the object is not new 
     #and new file supplied.   
     if obj.id != None and len(request.FILES) > 0: 

      import os 
      old_obj = m.Banner.objects.get(id = obj.id) 
      os.remove(old_obj.image.path) 

希望這有助於你,如果你得到了類似的問題。

相關問題