2012-09-13 40 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. 我可以寫上面的代碼更好嗎? (主要是不喜歡

    超(文檔,個體經營).save(* ARGS,** kwargs) 代碼的中間。

  2. 爲M2M更新我看着m2m_changed信號,但老實說,我不知道如何使用它
任何幫助表示讚賞

編輯:。

這其實很簡單,一旦你瞭解parametere,T hanks

回答

-1

請檢查此post m2m信號的使用情況。

您可以將所有後期保存處理邏輯移動到信號