2012-07-10 40 views
4

我有一個帶圖像字段的模型,我希望能夠使用ModelForm更改圖像。更改圖像時,應刪除舊圖像並用新圖像替換。在哪裏可以刪除模型圖像?

我試圖做到這一點的的ModelForm像這樣的清潔方法:

def clean(self): 
     cleaned_data = super(ModelForm, self).clean() 

     old_profile_image = self.instance.image 
     if old_profile_image: 
      old_profile_image.delete(save=False)   
     return cleaned_data 

也能正常工作,除非用戶指定的文件是不正確的(例如,如果它不是一個圖像)導致圖像被刪除而沒有保存任何新圖像。我想知道哪裏是刪除舊圖像的最佳位置?我的意思是,在刪除舊圖像之前,我可以確定新圖像是否正確?

編輯: 如果可能,我更喜歡在我的ModelForm類中執行此操作。

+0

我很困惑你的問題。有些不是問題(如代碼之後的第一句)。其他人,比如關於「最好」的問題是意見,或者與你的設計密切相關。我想提供幫助 - 你可以編輯你的問題一些更清楚嗎? – Erik 2012-07-10 21:07:01

+0

我已經編輯了一下。我希望現在更清楚。如果不讓我知道。 – WesDec 2012-07-10 21:13:07

回答

0

好吧我想出瞭如何使用ModelForm以乾淨的方式做到這一點。基本上我創建了一個名爲'ChangeImageForm'的類,它將確保在更改圖像時刪除舊圖像。此外,它也適用如果圖像是無效的:

class ChangeImageForm(ModelForm): 

    def clean(self): 
     cleaned_data = super(ModelForm, self).clean() 
     self.old_image = self.instance.image 
     return cleaned_data 

    def save(self, commit=True): 
     instance = super(ChangeImageForm, self).save(commit) 

     if self.old_image: 
      self.old_image.delete(save=False) 

     return instance 

現在,我可以很容易地從ChangeImageForm繼承這樣添加上述功能與圖像領域的ModelForm:

class MyModelForm(ChangeImageForm): 
    class Meta: 
     model = MyModel # model with an image field 

我想重寫ModelForm是做這件事的最好的地方,而不是Model類,因爲我只想在某些情況下刪除舊圖像。

0

一些答案:

的ImageField的應該驗證上傳的文件是通過Python圖像庫的圖像。如果不是,表格將不會生效。

您的ImageField應該有一個路徑屬性中的舊文件的路徑。

保存新圖像後,您可以刪除舊圖像。更好的是,永遠不要使用用戶的文件名輸入作爲文件名。這樣更安全,你可以使用相同的文件名 - 然後每次只覆蓋舊文件,並可以刪除刪除步驟。

祝你好運。

相關問題