2

私は画像をアップロードする方法についてのチュートリアルを進めていますが、この男が提出された写真のサムネイルを生成するために使用する方法に完全に迷っています

これが彼のコードの切り詰められたチャンクです:

import os.path
from PIL import Image as PImage
from settings import MEDIA_ROOT
from tempfile import *

class Image(models.Model):
    image = models.FileField(upload_to="images/")
    thumbnail = models.ImageField(upload_to="images/", blank=True, null=True)

    def save(self, *args, **kwargs):
        super(Image, self).save(*args, **kwargs)
        im = PImage.open(pjoin(MEDIA_ROOT, self.image.name))

        fn, ext = os.path.splitext(self.image.name)
        im.thumbnail((128,128), PImage.ANTIALIAS)
        thumb_fn = fn + "-thumb" + ext
        tf = NamedTemporaryFile()
        im.save(tf.name, "JPEG")
        self.thumbnail.save(thumb_fn, File(open(tf.name)), save=False)
        tf.close()

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

したがって、これに関する私の具体的な質問は次のとおりです。

  1. 彼が画像にFileFieldを使用し、サムネイルにImageFieldを使用する理由は何ですか?
  2. 私が理解していることからsuper(Image, self).save(*args, **kwargs)、モデルを保存します。しかし、なぜ彼は最後にそれを再び呼ぶのですか?
  3. それから私は役割が果たしていることと、呼び出されNamedTemporaryFile()たときに正確に何が起こるかを本当に理解していませんself.thumbnail.save(thumb_fn, File(open(tf.name)), save=False)
4

1 に答える 1

2
  1. メイン画像にも ImageField を使用します。ImageField は FileField を継承しますが、画像ファイルのみをアップロードできるようにし ます。

  2. 最初save()に画像オブジェクトを DB に保存しますが、(おそらく) サムネイルはまだ設定されていません。2 番目save()の呼び出しは、インスタンスに加えられた変更 (サムネイルの追加) で DB を更新します。

    彼はサムネイル フィールドを で設定しますが self.thumbnail.save(thumb_fn, File(open(tf.name)), save=False)、それはサムネイルを適切な場所のファイルに保存し、インスタンスの属性にthumbnailそのパスを入力するだけです。save()次に、Image インスタンスを再度呼び出して、オブジェクトの変更を DB に更新する必要があります (サムネイルが追加されます)。

  3. コードはアップロードされたメイン画像ファイルを読み取り、メモリ内のその画像を使用してサムネイルを作成します (メモリ内にはまだファイルとして存在しません)。

    ただし、そのサムネイルはファイルに保存する必要があるため、Django ImageFile(アップロードされたファイルが一時的にディスクに保存されることを期待) で使用できますNamedTemporaryFile。 インスタンスは、そのファイルを適切な場所 (設定 + 引数で設定) にコピー

    します。ImageFileMEDIA_ROOTupload_to

于 2012-05-27T09:56:53.210 に答える