【django】ImageFieldの使い方【開発環境編】

当ページのリンクには広告が含まれています。
  • URLをコピーしました!

djangoでの画像ファイルの扱い方は他のフィールドと異なるため初見では分かりづらい部分があります。

今回は、開発環境でメディアファイルを扱えるようにする方法をご紹介いたします。

この記事におすすめの人
  • django初心者
  • models.pyにImageFieldを追加したい

Django/DjangoRESTframeworkについて記事まとめ

目次

mediaディレクトリの追加

画像ファイルアップロード用のディレクトリを作成します。djangoのルートディレクトリに配置します。

$ mkdir media

models.pyの記述

models.pyImageFieldを含んだモデルを作成していきます。

upload_toで、画像ファイルの保存先が指定できます。

from django.db import models


class Image(models.Model):
    name = models.CharField(max_length=255, unique=True)
    image = models.ImageField(upload_to='images/')

    def __str__(self):
        return self.name

また、upload_toに直接パスを指定するのではなく、関数を呼び出して任意の処理に変えることもできます。

django:upload_toについて
https://docs.djangoproject.com/en/3.2/ref/models/fields/#django.db.models.FileField.upload_to

def directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return 'user_{0}/{1}'.format(instance.user.id, filename)

class Image(models.Model):
    name = models.CharField(max_length=255, unique=True)
    image = models.ImageField(upload_to=directory_path)

settings.pyの編集

settings.pyにメディアディレクトリの場所を書きます。

開発環境

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

画像配信のために、urls.pyに下記も記述します。開発環境では記載しないとエラーになります。

from django.contrib import admin
from django.urls import path, include

# 追記
from . import settings
from django.contrib.staticfiles.urls import static, staticfiles_urlpatterns

urlpatterns = [
   ・・・
]

# 追記
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

サーバーから直接配信

S3GCSから配信する場合は異なりますが、デプロイしたサーバー上から配信する場合にはデプロイ時にMEDIA_ROOTを書き換える必要があります。

nginxから画像ファイルを配信する場合には、下記のように設定しています。

MEDIA_ROOT = '/usr/share/nginx/html/media'

Pillowのインストールとマイグレーション

画像ファイルの扱うライブラリPillowをインストールします。

$ pip install pillow

データベースへ変更を伝えるためマイグレーションします。

$ python manage.py makemigrations

$ python manage.py migrate

テストで管理画面からアップロード出来たら成功です。

参考記事

Django学習におすすめの教材

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次