使用m2m_changed信号

时间:2012-09-13 15:10:43

标签: python django django-signals

首先提供一些关于应用程序的信息:我希望能够上传pdf文件,将pdf文件转换为图像(每个pdf页面都有一个图像)。这些图像将在网站上显示,pdf可以下载:到目前为止我有这个:

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')

现在创建图像和图像对象我覆盖了Document类的保存功能:我看起来像这样:

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. 我可以更好地编写上面的代码吗? (大多数人不喜欢

      

    super(文档,自我).save(* args,** kwargs)   在代码中间。

  2.   
  3. 对于m2m更新,我查看了m2m_changed信号,但老实说我不明白如何使用它。
  4.      任何帮助表示赞赏。

    编辑:

    一旦你理解了参数,这实际上很容易,谢谢

1 个答案:

答案 0 :(得分:-1)

检查post m2m信号的使用情况。

您可以将所有后期保存处理逻辑移至信号