2017-06-18 7 views
0

保存機能を上書きしようとしています。私が望むのは、元の写真をデフォルトのサイズ(800 * 534)にリサイズし、この画像のサムネイルを生成することです。しかし、写真は2度保存されていました。Djangoはなぜ画像を2回保存しますか?

たとえば、初めてsample.jpgという名前の写真を追加します。私の指示には3枚の写真があります。 1つは../Media/photos/にあり、他は../Media/にあります。この写真をもう一度保存すると、4枚の写真があります。 2つは../Media/photos/にあり、他は../Media/にあります。

Djangoが画像を2回保存している理由と、なぜ画像が../Media/photosに保存されていないのかが混乱しています。私が望むのは、800 * 534の画像とそのサムネイル画像を../Media/photosに入れた2枚の画像だけを作ることです。

これは私のコードです。

クラス写真:私は写真

def save(self): 
    if not self.pk: 
     filename = self.image 
     if filename: 
      print(filename) 
      img = Image.open(filename) 
      # save the default size photo 
      default_size = (800, 534) 
      img.thumbnail(default_size, Image.ANTIALIAS) 
      img.save(self.get_img_filename(filename)) 

      # save thumbnail photo 
      cover_size = (342, 229) 
      img.thumbnail(cover_size, Image.ANTIALIAS) 
      img.save(self.get_img_thumb_filename(filename)) 
    super(Photo, self).save() 

クラスで書いた

class Photo(models.Model): 
    title = models.CharField(max_length=250) 
    slug = models.SlugField(max_length=250) 
    summary = models.TextField(blank=True) 
    created_date = models.DateField(auto_now_add=True) 
    modified_date = models.DateField(auto_now=True) 
    image = models.ImageField(upload_to='photo/') 
    album = models.ForeignKey(Album, on_delete=models.CASCADE) 
    is_cover_photo = models.BooleanField(default=False) 

保存機能と、他の二つの機能:

def get_img_filename(self, img): 
    return img.path 

def get_img_thumb_filename(self, img): 
    img_pre, img_ext = os.path.splitext(img.path) 
    thumb_name = img_pre + '_thumb' + img_ext 
    return thumb_name 
+0

これを保存すると、 'super()'コールも保存されます。 –

答えて

0

あなたのプログラムがまだあるので、これが起こります暗黙的に "image"を含むすべてのフィールドを保存するスーパークラスのsaveメソッドを呼び出します。したがって、サーバーにイメージが重複しています。あなたはこのように機能を保存内parametterを渡すことができ

0

img.save(self.get_img_filename(filename), save=False) 

あなたの問題は、あなたがとlocalY画像をPIL.Image保存されているプラ​​スモデルDBにあなたが別のそれを呼び出しているということですLukas Hermanのように、それをローカルに保存しないでください。 PIL.Image.save()を使用せずにImageFieldにImageを格納する方法が必要です。 link-stackoverflow イメージクラスを使用してイメージを保存し、パスの場所をCharFieldまたはTextFieldに保存することもできます。

+0

こんにちは、モラド!私はこの方法を試みたが、うまくいかなかった。 – Xiaohang

+0

私はあなたのコードを誤解して申し訳ありません私はimgがPIL.Imageであることが判明したImageFIeldであると仮定しました。解決策へのリンクで回答を編集しました – devcodexyz

関連する問題