記事の目的
djangoを勉強していく上でつまづいたところや覚えておきたいことを備忘録的に記す
つまづいたところ
画像のアップロード
やりたいこと
モデルを以下のように作成してフォームからデータを追加できるようにしたい
models.py
class ImageModel(models.Model):
name = models.CharField(max_length=100)
img = models.ImageField(upload_to='')
author = models.CharField(max_length=100, null=True)
エラー
以下の画像のように this field is required
と表示されてしまう
解決策
htmlファイルのformの表記を
<form action="" method="POST" >
↓
<form action="" method="POST" enctype="multipart/form-data">
と変更する
アップロードされた画像を加工して表示する
やりたいこと
formを用いてアップロードされた画像を加工して加工前と後のものを両方表示する
####つまづいたこと
cv2でオープンして加工しようとしたが以下のエラーが吐かれた
(MEDIA_URL = 'medi'として実行してみる)
####解決策
MEDIA_URL, MEDIA_ROOTの設定の時に何も考えずに設定していたが同じにしないといけなかった.
setting.py
#画像を表示するときにurlの一部となる(あまりわかってない)
MEDIA_URL = 'media/'
#画像がアップロードされた時の保存先
#本番環境でも使える書き方(DEBUG = True/Falseで条件分岐)
if DEBUG:
MEDIA_ROOT = BASE_DIR / 'media'
else:
MEDIA_ROOT = f'/var/www/{BASE_DIR.name}/media'
結局MEDIA_ROOTは画像のurlの一部になるもので表示する際に必要となる.
画像をアップロードするだけで終わりならべつに問題はなかったが後からそのurlからパスを取ってきて加工するためには実際に保存する先(MEDIA_ROOT)と同じにしなければならない.
またurlからpathを取得するときは画像のurlとBASE_DIRから成るので以下のようにstr型にcastして結合しなければならない
views.py
from django.conf import settings
path = str(settings.BASE_DIR) + url