2012-01-08 19 views
3

モデルのインスタンスを保存しているときにイメージのサイズを変更しようとしています。保存する前にDjango ImageFieldの内容を取得するには?

class Picture(models.Model): 
    image_file = models.ImageField(upload_to="pictures") 
    thumb_file = models.ImageField(upload_to="pictures", editable=False) 
    def save(self, force_insert=False, force_update=False): 
    image_object = Image.open(self.image_file.path) 
    #[...] nothing yet 
    super(Picture, self).save(force_insert, force_update) 

問題は、モデルを保存する前にself.image_file.pathが存在しないことです。正しいパスを返しますが、イメージはまだありません。画像がないので、サイズ変更のためにPILで開くことができません。

thumb_file(別のImageField)にサムネイルを保存したいので、モデルを保存する前に処理を行う必要があります。

ファイルを開くには良い方法がありますか(メモリ内にtmpイメージオブジェクトがあるかもしれません)、最初にモデル全体を保存し、サイズを変更してから再度保存する必要がありますか?

答えて

0

たぶん、あなたはファイルを直接開いて、Image.openに結果のファイルハンドルを渡すことができます。

image_object = Image.open(self.image_file.open()) 

申し訳ありませんが、私は今それをテストすることはできません。

+4

のいずれか.. > 'NoneType' オブジェクトには属性がありません動作する – JasonTS

2

私はthis snippetを使用:

import Image 

def fit(file_path, max_width=None, max_height=None, save_as=None): 
    # Open file 
    img = Image.open(file_path) 

    # Store original image width and height 
    w, h = img.size 

    # Replace width and height by the maximum values 
    w = int(max_width or w) 
    h = int(max_height or h) 

    # Proportinally resize 
    img.thumbnail((w, h), Image.ANTIALIAS) 

    # Save in (optional) 'save_as' or in the original path 
    img.save(save_as or file_path) 

    return True 

とモデルで:何それは動作しません

def save(self, *args, **kwargs): 
    super(Picture, self).save(*args, **kwargs) 
    if self.image: 
     fit(self.image_file.path, settings.MAX_WIDTH, settings.MAX_HEIGHT) 
+1

を '読み取り'、しかし、私は別のimagefieldに親指を格納する..それは私がモデルを保存する前にサイズを変更する必要がある理由です。 – JasonTS

+0

問題なく、名前の接頭辞を含むフィット関数で新しい画像を作成します。例 "t_"。そして、モデルの追加機能では、あなたの親指にパスを返します。 –

+0

ex:[sorl](https://github.com/sorl/sorl-thumbnail) –

関連する問題