2012-06-20 4 views
2

내 프로젝트에서 Imagekit을 사용하여 이미지를 처리하는 모델이 있습니다. 새로운 이미지가 예전 제거해야로드 고유 한 이름 Imagekit - 원본 이미지 삭제 후 캐시 이미지가 삭제되지 않았습니다.

  • (캐시의 축소판

    • 이름 바꾸기 이미지와 썸네일로 갱신한다 : 나는 이미지를 저장할 때 나는 다음과 같은 요구 사항이 새로운 이미지).

      모델 :

      def generate_cache_filename(instance, path, specname, extension): 
          extension = '.jpg' 
          return 'cache/images_upload/%s_%s%s' % (instance.pk, specname, extension) 
      
      def generate_image_filename_1(instance, filename): 
          filename = '1' 
          extension = '.jpg' 
          return 'images_upload/%s_%s%s' % (instance.pk, filename, extension) 
      
      class Model(models.Model): 
          name = models.CharField(max_length=40) 
          image_1 = ProcessedImageField([Adjust(contrast=1.2, sharpness=1.1), ResizeToFill(500, 370)], upload_to=generate_image_filename_1, format='JPEG', options={'quality': 90}) 
          thumbnail_1 = ImageSpec([Adjust(contrast=1.2, sharpness=1.1), ResizeToFill(83, 78)], image_field='image_1', cache_to=generate_cache_filename, format='JPEG', options={'quality': 90}) 
      

      양식 (이 새에 의해 교체 될 때 이미지를 삭제하기 위해) :

      if form.is_valid(): 
          form_image = form.cleaned_data['image_1'] 
           try: 
            details = Model.objects.get(pk=pk) 
            if details.image_1 != form_image: 
             details.image_1.delete(save=False) 
           except Model.DoesNotExist: 
            pass 
           form.save() 
      

    , 나는 다음 코드를 사용하려면이 작업을 수행하려면

    이미지의 이름을 바꾸고 image_1 (= 새 이미지로드 및 오래된 이미지 삭제) 부분을 바꾸는 부분은 정상적으로 작동합니다. 그러나 어떤 이유로 캐시의 thumbnail_1이 새로 고침되지 않습니다 (= 여전히 이전 이미지의 미리보기 이미지 임).

    폼의 삭제 코드와 관련이 있다고 생각합니다. 그러나이를 해결하는 이유와 방법을 파악할 수 없습니다. 제안이있는 누군가?

    업데이트 1 : 또한 '이름 바꾸기'와 관련이 있습니다. 몇 가지 추가 테스트를 수행했습니다. image_1 파일의 이름을 변경하지 않으면 모든 것이 잘 작동하고 (미리보기 이미지 새로 고침). 그러나 동일한 이름의 다른 이미지를로드하면 동일한 문제가 발생합니다. image_1은 업데이트되지만 thumbnail_1은 여전히 ​​이전 이미지의 미리보기 이미지입니다.

    업데이트 2 : 일부 더 많은 테스트를했고, 같은 파일 이름으로 새 이미지를 업로드 할 때, 나는 확실히 tryif statement를 입력합니다. 따라서 오래된 이미지가 삭제됩니다. Imagekit의 문서에 따르면 미리보기 이미지도 삭제해야합니다. 그러나 이것은 사실이 아닙니다.

    감사합니다.

  • +0

    업데이트 : 좀 더 테스트를했고, 같은 파일 이름으로 새 이미지를 업로드 할 때, 나는 확실히 try''에서'경우 statement'를 입력합니다. 따라서 오래된 이미지가 삭제됩니다. Imagekit의 문서에 따르면 미리보기 이미지도 삭제해야합니다. 그러나 이것은 사실이 아닙니다. –

    답변

    1

    나는 뜻밖의 해결책을 찾았습니다. 위의 코드가 작동하지 않는 주된 이유는 원본 이미지를 삭제 한 후에 삭제되지 않은 캐시의 축소판 때문이었습니다. 특히 새 이미지의 파일 이름이 이전 이미지와 동일하지만 => 축소판 이미지 절대로 삭제되지 않았습니다. => 원본을 삭제할 때 캐시 된 이미지가 항상 삭제 될 것으로 예상했기 때문에 여전히 이유는 모르지만 .... 다음 코드 모두를 사용

    는 예상대로 작동합니다

    def generate_cache_filename(instance, path, specname, extension): 
        extension = '.jpg' 
        return 'cache/images_upload/%s_%s%s' % (instance.pk, specname, extension) 
    # generate random string of 10 characters 
    def id_generator(size=10, chars=string.ascii_uppercase + string.digits): 
        return ''.join(random.choice(chars) for x in range(size)) 
    
    def generate_random_filename(instance, filename): 
        filename = id_generator() 
        extension = '.jpg' 
    return 'images_upload/%s_%s%s' % (instance.pk, filename, extension) 
    
    class Model(models.Model): 
        name = models.CharField(max_length=20) 
        image_1 = ProcessedImageField([Adjust(contrast=1.2, sharpness=1.1), ResizeToFill(500, 370)], upload_to=generate_random_filename, format='JPEG', options={'quality': 90}) 
        thumbnail_1 = ImageSpec([Adjust(contrast=1.2, sharpness=1.1), ResizeToFill(83, 78)], image_field='image_1', cache_to=generate_cache_filename, format='JPEG', options={'quality': 90}) 
    

    View.py

    Model.py : 은 기본적으로 내가 새로운 업로드 된 이미지는 항상 다른 파일 이름이 확인했다

    # thanks to jdi for the help in the for-loop 
    if form.is_valid(): 
         # A for loop is used here, because my database contains 5 images and 5    thumbnails 
         image_list = ['image_%d' % i for i in xrange(1,6)] 
         for image_name in image_list: 
          form_image = form.cleaned_data[image_name] 
          try: 
           details = Model.objects.get(pk=pk) 
           if getattr(details, image_name, None) != form_image: 
            getattr(details, image_name, None).delete(save=False) 
          except Model.DoesNotExist: 
           pass 
    

    다른 사람들에게도 도움이되기를 바랍니다.

    친절 감사