djangoに画像をアップロードする際、自動でリサイズとかしたいときにdjango-imagekitを使うと便利らしい。
django-imagekit
インストール
githubのリンクに書いてある通り。
pip install pillow pip install django-imagekit
settings.pyのINSTALLED_APPSに'imagekit'を追加
ImageSpecField
ImageFieldにアップロードした画像のサムネを作りたいときなんかはImageSpecFieldを使う。
githubのreadmeのままだけど…
from django.db import models from imagekit.models import ImageSpecField from imagekit.processors import ResizeToFill class Profile(models.Model): avatar = models.ImageField(upload_to='avatars') avatar_thumbnail = ImageSpecField(source='avatar', processors=[ResizeToFill(100, 50)], format='JPEG', options={'quality': 60})
avatarは普通にImageFieldを使って定義したもの。ImageSpecFieldの引数の意味はなんとなく分かると思う。sourceは元になるImageField、アップロード先は指定する必要ないです。
ImageSpecFieldは仮想的な(?)もので実際にデータベースに'avatar_thumnail'という列は作らない。
これでProfile.avatarに画像をアップロードした際に自動的にリサイズされjpg変換されたサムネ画像が生成される。
サムネ画像の保存先
そのサムネ画像が生成される場所はデフォルトだと,settings.pyで設定したMEDIA_ROOTの相対パスi'CACHE/images/upload_to'になるっぽい。
例えばsettings.pyにおいて
MEDIA_ROOT = 'home/tanishiking/django_project/cms/media/'
の場合、保存先は
home/tanishiking/django_project/cms/media/CACHE/images/avatar/filename.jpg
これはsettings.pyでIMAGEKIT_CACHEFILE_DIRをいじくることで変えられる。
テンプレート側でサムネ画像を呼び出すときは
<img src="{{ profile.avatar_thumbnail.url }}" />
で呼び出せる。
トラブルシューティング
サムネ画像が生成されない
サムネ画像の保存先のディレクトリが無くて作られなかった?
python manage.py generateimages
でディレクトリ、画像が作られて、その後は普通にサムネ画像が作られるようになった。