0

まず、アプリに関するいくつかの情報:pdfファイルをアップロードできるようにしたいのですが、そのpdfファイルは画像に変換されます(pdfページごとに1つの画像)。これらの画像はウェブサイトに表示され、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関係を更新することを意味します。今私は2つの質問があります:

  1. 上記のコードをもっとうまく書くことはできますか?(ほとんどの場合、

    コードの途中でsuper(Document、self).save(* args、** kwargs)。

  2. m2mアップデートでは、m2m_changedシグナルを見ましたが、正直なところ、その使用方法がわかりません。
どんな助けでも大歓迎です。

編集:

パラメータを理解すれば、実際には非常に簡単です。ありがとう

4

1 に答える 1

-1

m2m信号の使用法についてはこの投稿を確認してください。

すべてのポストセーブ処理ロジックをシグナルに移動できます

于 2012-09-13T15:49:29.127 に答える