Django で画像を表示する

Python

前回の続きです。

Django で Template Engine を使用してみる
前回の続きです。ほぼ udemy 「【3日でできる】はじめての Django 入門」の内容の備忘録になります。今回やること動的にテンプレートファイル(html)を作ってみます。やり方としては、Template Engine という...

ほぼ 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 の仕様的なことなので、おまじない的にやる必要があります。

  1. プロジェクトの urls.py に static ファイルを表示するためのパスの関連付けを定義
  2. プロジェクトの settings.py に static ファイルのパスを定義

それぞれやっていきます。

urls.py の変更

プロジェクトの urls.pymyfirstapp\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_URLsettings.MEDIA_ROOT を使用する

どちらにせよ、setting.py に定義する定数を使用することになっています。

settings.py を変更

プロジェクトの settings.pymyfirstapp\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 %}

これで、画像表示がちゃんとできるようになりました。

コメント

タイトルとURLをコピーしました