2011-08-09 2 views
0

사용자가 여러 이미지를 한 번에 업로드 할 수 있어야하는 장고 프로젝트를 진행 중입니다. 더 나은 제안이 없다면 프로젝트의 해당 부분이 SWFUpload에 의해 처리 될 것입니다.여러 이미지를 지원하기 위해 django-stdimage2 해킹

이미지 이름 바꾸기, 크기 조정 및 미리보기 이미지 작성은 django-stdimage2으로 처리됩니다.

문제점
장고 stdimage2 필드 이름을 이용하여 각 이미지를 바꾸고 기본 키 오브젝트. 기본 키 1이있는 기어 행에 5 개의 이미지가있는 경우, 5 개의 이미지 모두 "image_1.jpeg"로 이름이 바뀝니다.

가능한 해결책을 소개하기 전에 다음은 제 모델입니다. 기본적으로 하나의 기어 행에는 여러 개의 gear_image 행이있을 수 있습니다.

class gear(models.Model): 
     id = models.AutoField(primary_key=True) 
     model = models.CharField(max_length=100) 

class gear_images(models.Model): 
     id = models.AutoField(primary_key=True) 
     gear_id = models.ForeignKey(gear) 
     image = StdImageField(upload_to='images/gear', blank=True, size=(640, 480, True), thumbnail_size=(100, 100, True)) 

솔루션
내가 파일 이름에 밀리 초 둥근에, 타임 스탬프를 추가하는 생각을했다. 저는 파이썬이나 장고 프로도 아니지만 django-stdimage2의 fields.py 파일을 훑어 보았습니다. 나는이 코드를 편집하기 위해 필요한 코드가 있다고 생각합니다. 같은 보일 것

def _rename_resize_image(self, instance=None, **kwargs): 
    ''' 
    Renames the image, and calls methods to resize and create the thumbnail 
    ''' 
    if not kwargs.get('raw', None): 
     if getattr(instance, self.name): 
      filename = getattr(instance, self.name).path 
      ext = os.path.splitext(filename)[1].lower().replace('jpg', 'jpeg') 
      # time_stamp = int(round(time.time() * 1000)) 
      # dst = self.generate_filename(instance, '%s_%s_%s%s' % (self.name, instance._get_pk_val(), time_stamp, ext)) 
      dst = self.generate_filename(instance, '%s_%s%s' % (self.name, instance._get_pk_val(), ext)) 
      dst_fullpath = os.path.join(settings.MEDIA_ROOT, dst) 
      if os.path.normcase(os.path.abspath(filename)) != os.path.normcase(os.path.abspath(dst_fullpath)): 
       os.rename(filename, dst_fullpath) 
       if self.size: 
        self._resize_image(dst_fullpath, self.size) 
       if self.thumbnail_size: 
        thumbnail_filename = self._get_thumbnail_filename(dst_fullpath) 
        shutil.copyfile(dst_fullpath, thumbnail_filename) 
        self._resize_image(thumbnail_filename, self.thumbnail_size) 
       setattr(instance, self.attname, dst) 
       instance.save() 

각 이미지 이름 : image_1_159753456.jpeg
당신이 좋은 해결 방법입니다 생각하십니까 주석 처리되어 코드의 두 라인은 내 제안 된 솔루션입니까? 나는 다른 아이디어도 열려 있습니다.

감사합니다 :)

답변

0

나는 전혀 여기에 문제가 있다고 생각하지 않습니다.

django-stdimage {2}는 상위 기어 모델이 아닌 gear_images 모델의 개체 ID로 이름이 바뀝니다. 그래서 하나의 기어는 많은 이미지를 가질 수 있으며, 각각은 파일 이름에 gear_images pk가 추가됩니다.

사실 gear_images pk 대신 파일 모델에서 기어 모델의 pk를 사용하는 것이 중요한 경우에만 문제가 발생합니다. 당신이 후자와 괜찮 으면, 당신은 아무것도 할 필요가 없습니다, 그것은 단지 작동해야합니다.

+0

정말 고맙습니다. 당신의 설명이 의미가 있으며 나는 그것을 시험 할 것입니다. 나는 그런 식으로 생각 했어야했지만, 최근에는 다른 코딩 문제로 인해 마음이 어지럽게 흩어졌습니다. 감사 :) –

관련 문제