teratail header banner
teratail header banner
質問するログイン新規登録
Django

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

Python 3.x

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

Q&A

解決済

1回答

773閲覧

[Django]ImageFieldで既にアップロードした画像を選択したいです

neeuler

総合スコア9

Django

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

Python 3.x

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

0グッド

0クリップ

投稿2022/10/21 08:15

0

0

前提

Djangoでブログを作成しており、サムネイルの画像を投稿したいと考えています。
現状、ImageFieldで画像を投稿(mediaに保存とテンプレートで表示)するところまではできました。
しかし同じ画像を使いたい場合でも、「アップロードしてmediaに保存」という流れをとってしまい同じ画像がいくつも保存されてしまいます。

実現したいこと

サムネイルを投稿したいと考えております。
その際に
①新しい画像を使う際は、今まで通りmediaにアップロード。
②同じ画像をサムネにする際は、mediaディレクトリから参照し新たに画像を保存しない
というような機能をもたせたいです。

発生している問題・エラーメッセージ

調べ方が分からず行き詰っております。 サムネイルは作成できるが、同じ画像がいくつも保存されてしまいます。

該当のソースコード

python

1class Post(models.Model): 2 thumbnail = models.ImageField(upload_to="images",null=True,blank=True) 3

試したこと

thumbnail = RichTextUploadingField(null=True , blank=True)
モデルのクラスを上記のように書き換え、ckeditorを使ってみました。
しかし画像の情報以外に<p>タグ等も付与されていて、除去するのにコードが増える上にエラーが出やすくあまりいい方法ではないと思いました。

<input type="file">の参照先を変更して、URLのみをDBに保存できないか考えています(現在進行中)

補足情報(FW/ツールのバージョンなど)

python 3.10.8
django 4.1.2

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/10/21 12:18

何かに紐づいた画像なのであれば、それをモデルで管理するのがいいかと思います。 例えばユーザーに紐づいたものであればユーザーごとに登録する画像にするとか、記事につけるタグのようなものに紐づく画像なのであればタグごとに登録する顔像にするとかがいいかと思います。 特に紐づく情報がなく、純粋に同じ画像かどうかを比較したいのであれば、ちょっと時間もかかるかもしれませんが、md5やsha256などの軽いダイジェスト/ハッシュ値を画像に紐づけて、POSTされた際にその値で同一かどうかを判断するという形にする手はあります。ただしダイジェスト/ハッシュ値なので、(まずしないと思いますが、)衝突した場合の仕様も考える必要がありますが。。。 ご参考までに。
neeuler

2022/10/21 12:59

大変貴重なアドバイスありがとうございます。 紐づけるというのは意識していなかったので参考にさせていただきます。
guest

回答1

0

自己解決

解決はしていなのですが、なんとなく方向性が定まってきたので解決とさせてください

FilePathFieldというのを使おうと思います。(いたのかこんなやつ!)

FilePathField(path="mediaまでのpath",recursive=True(Trueならmedia以下の複数ディレクトリを読み込んでくれるらしい),null=Ture,blank=True)

これを新たにモデルクラスに追加して、アップロード用のImageFieldと選択のみの二つのfieldを用意することにしました。
(テンプレート側ではif文でどっちかを表示できるようにしました。)

ただFilePathFieldを素のまま使うと何の画像か分からないので表示して分かりやすくしようと思います。(=また沼にハマって長くなるので解決とさせてくださいごめんなさい)

投稿2022/10/21 13:17

neeuler

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問