2012-07-10 7 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

+0

조금 편집했습니다. 나는 지금 그것이 더 분명하게 희망한다. 나에게 알려주지 않으면. – WesDec

답변

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 

을 나는 무시 생각 어떤 경우에는 이전 이미지를 삭제하기 만하기 때문에 Model 클래스 대신 ModelForm을 사용하는 것이 가장 좋습니다.

0

일부 답변 :

ImageField 업로드 된 파일은 파이썬 이미징 라이브러리를 통해 이미지임을 확인해야합니다. 그렇지 않은 경우 양식이 유효성을 검사하지 않습니다.

ImageField의 경로 속성에 이전 파일에 대한 경로가 있어야합니다.

새 이미지를 저장하면 이전 이미지를 삭제할 수 있습니다. 더 나은, 사용자의 파일 이름 입력 파일 이름으로 사용하지 마십시오. 그것은 더 안전하며 동일한 파일 이름을 사용할 수 있습니다. 그러면 매번 이전 파일을 덮어 쓰고 삭제 단계를 삭제할 수 있습니다.

행운을 빈다.

관련 문제