djangoでアップロード画像の表示に苦戦したので、表示できない原因を残しておきます。
開発環境
- Windows 10(WSL Ubuntu18.04)
- django 3.0.5
前提条件
- FileField、ImageFieldなどを利用して画像アップロードができていること
画像を表示できない原因
1. settings.pyのMEDIA_ROOTとMEDIA_URLの設定が間違っている
MEDIA_ROOT→アップロードファイルを保存する場所を指定
アップロードした画像はMEDIA_ROOTで指定したディレクトリ内のupload_atで指定したフォルダ内に保存される。
MEDIA_URL→メディアディレクトリの公開用URLを指定
例えば、
MEDIA_URL='/media/'とした場合、
http://127.0.0.1:8000/media/{画像名}が画像を表示するための公開用URLになる。
2. {アプリ名}/urls.pyにstatic()文を追加
urls.pyにstatic(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)を入れることで
MEDIA_ROOTのディレクトリ内のファイルをMEDIA_URL起点のurlでアクセスできるようになる。
これがないと一致するURLパターンがないため、エラーとなると思う。
追加方法は以下の通り。
urls.py
urlpattern = [
・・・
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
3. htmlのimgやaタグのリンクに画像までのパスを指定する(私はこれが原因でした)
最後にhtmlファイルでimgやaタグを利用して画像を表示する。
imgのsrcやaのhrefには、アプリ名+MEDIA_ROOTを起点とした画像までのパスを指定する。
tmp.html
<img src="/{appname}/{画像ファイルへのパス}">
tmp.html
<a href="/{appname}/{画像ファイルへのパス}" download="output">