質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

940閲覧

(Django) 画像付きの投稿が出来ない.

WK_ZAKK

総合スコア20

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/11/18 23:58

Djangoフレームワークについて勉強しています.
画像付きの投稿をする際に参考にしているものとsettings.pyの記述が異なり,errorが発生しました.

まずBASE_DIRに関する記述ですが参考書では

django

1BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 2 3DATABASES = { 4 'default': { 5 'ENGINE': 'django.db.backends.sqlite3', 6 'NAME': os.path.join(BASE_DIR / 'db.sqlite3'), 7 } 8}

と記述されており私のsettings.pyでは

django

1BASE_DIR = Path(__file__).resolve().parent.parent 2 3DATABASES = { 4 'default': { 5 'ENGINE': 'django.db.backends.sqlite3', 6 'NAME': BASE_DIR / 'db.sqlite3', 7 } 8}

と記述されていました.
参考書に従ってsettings.pyの最下部に

django

1BASE_DIR = Path(__file__).resolve().parent.parent 2 3DATABASES = { 4 'default': { 5 'ENGINE': 'django.db.backends.sqlite3', 6 'NAME': BASE_DIR / 'db.sqlite3', 7 } 8} 9 10MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 11MEDIA_URL = '/media/'


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

の2行を追加しましたがこれではosが見つかりませんということでそもそもコマンドプロンプトからseverを起動することが出来ませんでした.

なので自分なりにこうかなと考え

django

1BASE_DIR = Path(__file__).resolve().parent.parent 2 3DATABASES = { 4 'default': { 5 'ENGINE': 'django.db.backends.sqlite3', 6 'NAME': BASE_DIR / 'db.sqlite3', 7 } 8} 9 10MEDIA_ROOT = BASE_DIR, 'media' 11MEDIA_URL = '/media/'

このように記述するとseverの起動には成功しましたが画像の新規投稿をすると以下のようなerrorが発生しました.
TypeError at /post_create
_getfullpathname: path should be string, bytes or os.PathLike, not tuple

このエラーについて調べてみるとpathはタプルではなく文字列で扱ってくれという意味らしいですが,
そもそもフレームワークの記述ルールが間違っているのではないかと考えておりますので,解決方法を教えていただけないでしょうか.

models.py

python

1 2class Post(models.Model): 3 author = models.ForeignKey(User, on_delete=models.PROTECT, blank=False) 4 title = models.CharField('タイトル', max_length=50) 5 content = models.TextField('内容', max_length=1000) 6 category = models.ForeignKey('Category', on_delete=models.PROTECT) 7 thumbnail = models.ImageField(upload_to = 'images/', blank=True) 8 created_at = models.DateTimeField(auto_now_add=True) 9 updated_at = models.DateTimeField(auto_now=True) 10

settings.py

python

1BASE_DIR = Path(__file__).resolve().parent.parent 2DATABASES = { 3 'default': { 4 'ENGINE': 'django.db.backends.sqlite3', 5 'NAME': BASE_DIR / 'db.sqlite3', 6 } 7} 8 9MEDIA_ROOT = BASE_DIR, 'media' 10MEDIA_URL = '/media/' 11

ちなみにimport osをして参考書通りにsettings.pyのBASE_DIRの内容を書き換えてrunseverしましたが
'NAME': BASE_DIR / 'db.sqlite3',
TypeError: unsupported operand type(s) for /: 'str' and 'str'
このようなエラーがでました.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

初めの実行時にimport osが抜けていたこととBASE_DIRの記述方法の変化により混乱していたようです.

django

1BASE_DIR = Path(__file__).resolve().parent.parent 2 3DATABASES = { 4 'default': { 5 'ENGINE': 'django.db.backends.sqlite3', 6 'NAME': BASE_DIR / 'db.sqlite3', 7 } 8} 9 10MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 11MEDIA_URL = '/media/'

こちらの記述で画像付きの新規POST投稿に成功しました.
Djangoのversionは3.1.2です.

投稿2020/11/19 17:45

WK_ZAKK

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問