2012-09-13 2 views
0

응용 프로그램에 대한 첫 번째 정보 : 나는 pdf 파일을 업로드 할 수 있기를 원하며 그 pdf 파일은 이미지로 변환됩니다 (모든 pdf 페이지 한 이미지). 이러한 이미지는 다음 웹 사이트에 표시되고 PDF로 다운로드 할 수 있습니다m2m_changed 신호를 사용하여

def upload_to(path): 
    def upload_callback(instance, filename): 
     return '%s' % os.path.join(settings.MEDIA_ROOT, path, str(instance), filename) 
    return upload_callback 

class Document(models.Model): 
    name = models.TextField() 
    pdf_file = models.FileField(upload_to=upload_to('pdfs')) 
    images = models.ManyToManyField('Image', null=True, blank=True) 

class Image(models.Model): 
    image = models.ImageField(upload_to='pdfimages') 

지금은 문서 클래스의 저장 기능을 덮어 이미지와 이미지 개체를 만들 : 지금까지 나는이이 나는 모습을 다음과 같이하십시오 :

def save(self, *args, **kwargs): 
    path = os.path.join(settings.MEDIA_ROOT, 'pdfs', self.name) 
    imagepath = os.path.join(settings.MEDIA_ROOT, 'pdfimages') 

    if os.path.exists(path): 
     for file_ in os.listdir(path): 
      if file_ == self.pdf_file.name: 
       continue 

    super(Document, self).save(*args, **kwargs) 

    save_to = os.path.join(path, os.path.splitext(self.pdf_file.name)[0] + 
          '_page.png') 
    pdffile = os.path.join(path, self.pdf_file.name) 

    args = ['convert', '-density', '100', '-depth', 
      '8', '-quality', '85', pdffile, save_to ] 

    subprocess.check_call(args, stdout=sys.stdout, stderr=sys.stderr) 
    for file_ in os.listdir(path): 
     if file_.endswith('png'): 
      try: 
       shutil.move((os.path.join(settings.MEDIA_ROOT, 
              'pdfs', self.name, file_)), 
          imagepath) 

      except Exception: 
       pass 

    for file_ in os.listdir(imagepath): 
     i, created = Image.objects.get_or_create(image="pdfimages/%s" % file_) 

첫 번째 코드는 그리 좋지 않지만 두 번째로 중요한 행동은 아직 없습니다. 문서에 이미지를 추가하면 m2m 관계가 업데이트됩니다. 이제 두 가지 질문이 있습니다.

  1. 위의 코드를 더 잘 쓸 수 있습니까? (대부분 코드의 중간에) **, * 을 kwargs로를 인수를

    슈퍼 (문서, 자기) .save을 (좋아하지 않는다. 나는 m2m_changed 신호 보았던 M2M 업데이트

  2. 하지만, 솔직히 그것을 사용하는 방법을 이해하지
를 어떤 도움에 감사드립니다

편집 :.. 당신이 parametere을 이해하면

그것은, 사실은 꽤 쉽게 t 행크

답변

-1

m2m 신호 사용에 대해서는 post을 확인하십시오.

모든 후 저장 처리 논리를

신호로 이동할 수 있습니다