質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

5111閲覧

Django 画像ファイルをリサイズして上書き保存ができない。

yuki1010

総合スコア43

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2016/10/02 19:44

編集2016/10/03 09:37

Djangoから画像ファイルを保存させて表示する所は実装できたのですが、この機能を更に画像を適切な画像ファイルに比率を変えずにリサイズして保存しすところが実装できません。
どなたかお力添えお願い致します。
【要件】
・アップロードしたら元の画像は消え新しく出来た写真を入れ替えて保存させる。
・Widthを600に合わせて比率を変えずに保存させる。

自分が途中まで書いたコードです。
pip install pillowでpillowをインストールしています。
(models.py)

python

1from django.db import models 2from core.models import TimeStampedModel 3 4from PIL import Image 5 6 7def upload_location(instance, filename): 8 instance_id = instance.id 9 return "%s/%s" % (instance_id, filename) 10 11 12class Event(TimeStampedModel): 13 title = models.CharField(max_length=200) 14 # この画像を変更(リサイズして上書き保存)したいです。 15 image = models.ImageField( 16 upload_to=upload_location, null=True, blank=True, 17 width_field="width_field", height_field="height_field") 18 height_field = models.IntegerField(default=0) 19 width_field = models.IntegerField(default=0) 20 21 def __str__(self): 22 return self.title 23 24 def save(self, *args, **kwargs): 25 # ここからがリサイズするメソッドを記入しました。 26 if self.image: 27 image = Image.open(self.image) 28 (width, height) = image.size 29 # 比率を維持させる処理 30 range_img = 600 / width 31 height = int(height * range_img) 32 self.image = image.resize((600, height), Image.ANTIALIAS) 33 self.image.save(self.image.path) 34 super(Event, self).save(*args, **kwargs) 35 36 37""" 38AttributeError: pathとエラーメッセージがでました。 39"""

ご回答よろしくお願いします。
何か簡単なプラグインなどもありましたらお教えいただけるありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

https://github.com/mariocesar/sorl-thumbnail
こちらを使うといかがですか。

pip install sorl-thumbnail

python

1# settings.py 2INSTALLED_APPS = [ 3... 4... 5... 6 'sorl.thumbnail', # 追加する 7]
python manage.py makemigrations thumbnail python manage.py migrate thumbnail

python

1# models.py 2from django.core.files.base import ContentFile # 追加 3from django.db import models 4 5from PIL import Image 6from sorl.thumbnail import ImageField, get_thumbnail # 追加 7 8 # saveメソッドを、以下のように 9 def save(self, *args, **kwargs): 10 if not self.id: 11 super().save(*args, **kwargs) 12 13 width = self.image.width 14 height = self.image.height 15 16 range_img = 600 / width 17 height = int(height * range_img) 18 scale = "{}x{}".format(600, height) 19 20 resized = get_thumbnail( 21 self.image, scale, crop='center', quality=99) 22 self.image.save(resized.name, ContentFile(resized.read()), True) 23 super().save(*args, **kwargs)

sorl-thumbnailは斜め読みしかしてないので、もう少し良い方法があるかもしれません。

投稿2016/10/03 11:03

toritoritorina

総合スコア972

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki1010

2016/10/04 00:53

ありがとうございます。なかなか挙動が難しく色々と悩みましたが sorl-thumbnailを使い別のアプローチで実装しました。 ・オリジナル画像を残し pathの階層を 年/月/日/ファイル名.jpgにしました。 ・色々な画像サイズのメソッドを追加することで Cache-年/月/日/ファイル名.jpgに出来る ・画像を持っているデータが削除されるとオリジナル画像とそれのChache画像も同時に削除させる です。 色々と勉強になり、ありがたいです。本当にいつもありがとうございます。(T_T)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問