前回の続きです。
ほぼ udemy 「【3日でできる】はじめての Django 入門」の内容の備忘録になります。
今回やること
ブラウザに画像を表示します。
が、正直今回のはややこしいというか、わけがわかっていないです・・・
仕様的なもので、「こういうものなんだ」と割り切ってみます。
前提1
前回までで、posts\models.py
に以下のようなクラスを定義しています。
この中で、image
というフィールド(テーブル的に言うとカラム)があるのですが、ここに設定されている画像を表示します。
class Post(models.Model):
title = models.CharField(max_length=100)
published = models.DateTimeField()
image = models.ImageField(upload_to='media') # ← これ!
body = models.TextField()
models.ImageField(upload_to=’media’) って何?
そもそも models.ImageField(upload_to='media')
って何なのかという話ですが、
- 型は
ImageField
(イメージを保存するカラム)で、テーブルには画像のパスが格納される - 実体は
upload_to='media'
と書かれている通り、アプリケーション内の「media」というフォルダに格納される
ということみたいです。
実際に前回までで作ってきたページでモデルへの操作(画像の登録)をやってみましたが、ブラウザでアップロードした画像は myfirstapp\media
というフォルダの中に保存されていました。
(文字で書いても意味が分からないと思うので、実際に動かして確認するほうが良いと思います)
ということで
media フォルダに画像が格納されていることを前提として、以下記述していきます。
例えば私が使っている PyCharm で表示されるプロジェクトツリーだと、以下のようになっています。
赤字になっているものが画像ファイルです。
前提2
今回扱う画像は、あらかじめ用意されているデータとします。
こういうメディアデータを、Django 的には static ファイル と呼ぶらしいです。
これらのファイルを扱うためには、特別な処理が必要みたいです。
static ファイルを表示する
やらないといけないことは以下の2点です。
どちらも Django の仕様的なことなので、おまじない的にやる必要があります。
- プロジェクトの
urls.py
に static ファイルを表示するためのパスの関連付けを定義 - プロジェクトの
settings.py
に static ファイルのパスを定義
それぞれやっていきます。
urls.py の変更
プロジェクトの urls.py
(myfirstapp\urls.py
)を、以下のように変更します。
# myfirstapp\urls.py
from django.urls import path, include
from django.contrib import admin
from django.conf.urls.static import static # ← これ追加
from django.conf import settings # ← これ追加
urlpatterns = [
path('posts/', include('posts.urls')),
path('admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # ← これ追加
import 関連はいいとして、+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
が「うわぁ」って感じですよね。
個人的には「もうこれおまじないでいいや」って思ってます。
意味合い的には、以下の感じでしょうか。
+ static(~)
で、URLパターンに static ファイルのパスを追加- static ファイルを見に行くときは、
settings.MEDIA_URL
とsettings.MEDIA_ROOT
を使用する
どちらにせよ、setting.py
に定義する定数を使用することになっています。
settings.py を変更
プロジェクトの settings.py
(myfirstapp\settings.py
)を、以下のように変更します。
# myfirstapp\settings.py
# ~省略~
STATIC_URL = '/static/'
MEDIA_URL = '/pics/' # ← これ追加
MEDIA_ROOT = BASE_DIR # ← これ追加
MEDIA_ROOT = BASE_DIR
とすることで、画像の入っているディレクトリ(media
)の親パスを設定します。
(BASE_DIR
はプロジェクトのディレクトリ絶対パスです。つまり、今回でいうと media
フォルダの親パスになります)
正直 MEDIA_URL
の必要性がいまいちピンときませんが(/
にしてもちゃんと動作する。何もなしにするとエラーになるけど)、こういうものなんでしょう。
テンプレートファイルに画像表示ソースを追加して動作確認
以下のように index.html
を変更します。
<!--抜粋-->
<!--Django のテンプレート-->
{% for post in posts.all %}
{{ post.title }}
<br/>
{{ post.published }}
<br/>
<img src="{{ post.image.url }}"/> <!-- ← これ追加 -->
{{ post.summary }}
<br/>
{% endfor %}
これで、画像表示がちゃんとできるようになりました。
コメント