Djangoメモ
10/17
■Python仮想環境に入るコマンド
$ source myvenv/bin/activate
■抜けるコマンド
$deactivate
10/18
■プロジェクト作成コマンド
django-admin startproject mysite .
プロジェクトのディレクトリ
├── manage.py
├── mysite
│ ├── init.py
│ ├── settings.py (タイムゾーン、ランゲージ、ALLOWED_HOSTSなど)
│ ├── urls.py
│ └── wsgi.py
├── myvenv
│ └── ...
└── requirements.txt
■Django webサーバ起動 (ポート指定)
python3 manage.py runserver 0.0.0.0:8090
■仮想マシンのIPアドレスを指定して確認
・http://192.168.111.8:8090/
10/18 no2
前提①blog/models.py ファイルで Model オブジェクトを全て定義する
前提②マイグレファイル作成
python manage.py makemigrations blog
■DBにModelのテーブルを作成する
①モデル追加をDBに反映
コマンド:python3 manage.py migrate blog
②エラーメッセージ:django.db.utils.OperationalError: attempt to write a readonly database
③オーナー・権限変更
sudo chown apache:apache ディレクトリ/db.sqlite3
sudo chown apache:apache ディレクトリ
sudo chmod 777 ディレクトリ/db.sqlite3
sudo chmod 777 ディレクトリ
④再f度:モデル追加をDBに反映
コマンド:python3 manage.py migrate blog
結果:
Operations to perform:
Apply all migrations: blog
Running migrations:
Applying blog.0001_initial... OK
10/21
ディレクトリ、ファイルを一発で作るコマンド
mkdir -p blog/templates/blog && touch blog/templates/blog/post_list.html
mkdir -p: -p オプションは、指定されたディレクトリが存在しない場合にのみディレクトリを作成します。また、必要な親ディレクトリも自動的に作成します。
blog/templates/blog: 作成したいディレクトリのパス。
&&: 前のコマンドが成功した場合にのみ、次のコマンドを実行します。
touch: 新しい空のファイルを作成するコマンド。
blog/templates/blog/post_list.html: 作成したいファイルのパス。
このコマンドを実行すると、blog ディレクトリの中に templates/blog ディレクトリが作成され、その中に post_list.html ファイルが作成されます。
10/19
Gitにプッシュ(初回)
git branchが何も返さない場合、それはアクティブなブランチがまだ存在しないことを示しています。これは、まだコミットが一つも存在しない新しいリポジトリに特有の現象です。
初めてのコミットを作成し、masterブランチ(またはmainブランチ)を作成する手順
①まず、全ての変更をステージングエリアに追加
git add .
②次に、初めてのコミットを作成
git commit -m "Initial commit"
これでgit branchを実行すると、新しく作成されたブランチ(通常はmasterまたはmain)が表示されるはず。
③最後に、この新しいブランチをGitHubにプッシュする。
git push -u origin master
※補足:ブランチ名がmainの場合は以下
git push -u origin main
※コミットの確認コマンド
git log
10/19
上記の前提
GitHubのリモートリポジトリのURLを設定する
GitHubのリモートリポジトリのURLを設定する際には、通常、git remote addコマンドを使用します。このコマンドは、リモートリポジトリをローカルGitリポジトリに関連付けるために使用されます。リモートの名前は通常「origin」となっていますが、任意の名前を付けることができます。
例えば、GitHubのリポジトリURLがhttps://github.com/yourusername/yourrepository.gitである場合、以下のコマンドを使用してリモートを追加します:
git remote add origin https://github.com/yourusername/yourrepository.git
⇒ git remote add origin https://github.com/uoxxx/my-first-blog.git
10/21
GitHubにpush(2回目以降)
①どのファイルを変更したか見て
・コマンド実行
$ git status
②Djangoのディレクトリにいることを確認して、 git に対してこのディレクトリ内の変更を全て反映させるよう指示
・コマンド実行
$ git add --all .
・結果
成功していれば、特に値は返ってこない。
※--all をつけると、 git は、ファイルを削除したかどうかも判定します (これがない初期設定の状態では、新しいファイルと変更されたファイルしか認識しません)。
③gitcommit前に変更箇所を確認する。
・コマンド実行
$ git status
・結果
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: blog/templates/blog/post_list.html
new file: blog/urls.py
modified: blog/views.py
modified: mysite/urls.py
下4行で、作成したファイル、ディレクトリが表示されていることが確認できた。
④コミットする。
・コマンド実行
$ git commit -m "Changed the HTML for the site."
ここではテンプレートのHTMLを追加したことを記述した。
・結果
(myvenv) [test@localhost djangogirls]$ git commit -m "Changed the HTML for the site."
[master cf224a1] Changed the HTML for the site.
4 files changed, 37 insertions(+), 1 deletion(-)
create mode 100644 blog/templates/blog/post_list.html
create mode 100644 blog/urls.py
mode change 100644 => 100755 mysite/urls.py
結果からコミットが成功していることがわかります。以下のポイントで成功していることが確認できる。
[master cf224a1] Changed the HTML for the site.: コミットがmasterブランチに成功し、コミットハッシュがcf224a1であることを示しています。また、コミットメッセージ "Changed the HTML for the site." も表示されています。
4 files changed, 37 insertions(+), 1 deletion(-): 4つのファイルが変更され、37行が追加され、1行が削除されたことを示しています。
create mode 100644 blog/templates/blog/post_list.html: blog/templates/blog/post_list.htmlファイルが新しく作成されました。
create mode 100644 blog/urls.py: blog/urls.pyファイルが新しく作成されました。
mode change 100644 => 100755 mysite/urls.py: mysite/urls.pyファイルのモード(アクセス権限)が変更されました。
ファイル関連の情報:※commitとはローカルリポジトリに変更を保存すること。
⑤GitHubにpushする。
・コマンド実行
$ git push
・user、passを聞かれる。passはGithubで指定したPersonal access tokens (classic)を使用した。
Username for 'https://github.com': xxxx
Password for 'https://xxxx@github.com':
・結果
Counting objects: 15, done.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (10/10), 1.29 KiB | 0 bytes/s, done.
Total 10 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
remote: To https://github.com/xxxxxxxxxx/my-first-blog.git
7931caa..cf224a1 master -> master
Compressing objects: 100% (8/8), done.: 変更されたオブジェクトを圧縮しています。
Writing objects: 100% (10/10), 1.29 KiB | 0 bytes/s, done.: 変更されたオブジェクトをリモートリポジトリに書き込んでいます。
remote: Resolving deltas: 100% (3/3), completed with 3 local objects.: リモートリポジトリが差分を正しく解決しています。
7931caa..cf224a1 master -> master: これは、masterブランチの最新のコミットがリモートのmasterブランチに正しくプッシュされたことを示しています。
Counting objects: 15, done.: Gitが変更されたオブジェクトの数を数えています。※初めてリモートブランチにプッシュする場合、通常はgit push -u origin masterのように使用します。ここでの-uオプションは"upstream"の略で、今後git pushだけでこのブランチにプッシュできるように設定する意味があります。しかし、一度-uオプションを使用してプッシュすれば、次回からはgit pushだけで良くなります。
10/22
■Djangoインタラクティブコンソールの起動
(myvenv) ~/django実行ディレクトリ$ python manage.py shell
プロンプトが以下に切り替わる。
(InteractiveConsole)
プロンプトを閉じる
exit()
※Djangoのインタラクティブコンソールとは、通常のPythonのインタラクティブシェルのように動作しますが、Djangoのフレームワークの機能と連携しています。このため、Djangoのモデルやデータベースといった機能をこのコンソール内で直接扱うことができます。このコンソールは開発中にデータやコードの動作をリアルタイムで確認・操作するのに非常に便利です。
10/22
クエリをhtmlに埋め込むところまで済。
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
10/31
CSSが適用されていない場合、いくつかのステップを確認する必要があります:
collectstaticコマンドを実行する: Djangoは静的ファイルをサービスするために、collectstaticを実行して、静的ファイルを適切な場所(例えばstaticディレクトリ)に集める必要があります。これを行うには、次のコマンドを実行します。
①
python manage.py collectstatic
これにより、新しいCSSファイルが静的ファイルのディレクトリにコピーされます。
②
Type 'yes' to continue, or 'no' to cancel: yes (yesと答える)
10/31
models.pyの変更後(画像追加のためにImageFieldを追加)マイグレ時にエラー。
DjangoのImageFieldを使用するには、画像処理ライブラリであるPillowが必要です。エラーメッセージはPillowがインストールされていないことを指摘しており、これが原因でマイグレーションを作成できない状況です。
以下の手順でPillowをインストールしてください:
まず、仮想環境がアクティベートされていることを確認します。コマンドラインプロンプトの先頭に(myvenv)が表示されていれば、仮想環境は既にアクティベートされています。
次に、以下のコマンドでPillowをインストールします。
pip install Pillow
Pillowがインストールされたら、再びマイグレーション作成のコマンドを実行します。
python manage.py makemigrations
これでImageFieldに関連するエラーは解決し、マイグレーションファイルを作成することができるはずです。
問題:画像が上手く表示されず。ルーティングに問題ありと考え以下の対応をした。
MEDIA_ROOT は Django プロジェクトの settings.py ファイルに設定されている変数で、アップロードされたメディアファイル(ユーザーがアップロードした画像や動画など)を保存する場所を指定します。MEDIA_ROOT を見つけるためには、以下の手順を実行することができます。
Django プロジェクトのルートディレクトリに移動します。これは manage.py ファイルがある場所です。
プロジェクトの settings.py ファイルを開きます。
ファイル内で MEDIA_ROOT を探します。この設定は以下のようになっているはずです:
python
Copy code
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
または、もし pathlib を使用している場合は、次のようになっているかもしれません:
python
Copy code
MEDIA_ROOT = BASE_DIR / 'media'
ここで BASE_DIR はプロジェクトのベースディレクトリを指し、通常は settings.py ファイルの上部で定義されています。
MEDIA_ROOT の実際のパスを確認するためには、以下のように Django シェルを使って確認することができます:
コマンドラインで Django シェルを開始します。
bash
Copy code
python manage.py shell
settings から MEDIA_ROOT の値を取得します。
python
Copy code
from django.conf import settings
print(settings.MEDIA_ROOT)
このコマンドによって出力されるパスが、実際にサーバー上でファイルを保存している場所です。そのパスにアクセスし、メディアファイルが正しく保存されているかどうかを確認できます。もし、このディレクトリが存在しない、または空であれば、アップロードプロセスに何らかの問題があることを示します。また、Django アプリケーションがファイルをアップロードする際に、正しいパスを使用しているかを確認する必要があります。
コマンド実行結果
(InteractiveConsole)
from django.conf import settings
print(settings.MEDIA_ROOT)
/home/test/musicdb/media
→しかし、mediaディレクトリが無い
ーーーーーーーーーーーーーーーーーー
Djangoプロジェクトにおいて、MEDIA_ROOT が指すディレクトリが存在しない場合、以下の手順に従って作成することができます。
まず、Djangoが稼働しているサーバーにアクセスし、MEDIA_ROOT が指し示すパスに移動します。以下は、コマンドラインを使用してディレクトリを作成する一般的な方法です。ただし、このコマンドはLinuxベースのシステムに対してのものです。もしWindowsを使用している場合は、適切なコマンドを使って同様の操作を行ってください。
bash
Copy code
mkdir -p /home/test/musicdb/media
このコマンドは、/home/test/musicdb/ に media という名前のディレクトリを作成します。-p オプションは、必要に応じて親ディレクトリも作成することを意味します。
その後、Djangoの管理画面からまたはDjangoのアップロード機能を使用してファイルをアップロードすると、ファイルはこの media ディレクトリに保存されます。
また、Webサーバーがこのディレクトリに対して適切な読み書き権限を持っていることを確認する必要があります。権限が不足している場合は、Webサーバーがファイルを読み取ったり書き込んだりできなくなる可能性があります。
もしPythonAnywhereを使用している場合、Webタブに移動して、静的ファイルの設定を確認し、/media/ のURLが MEDIA_ROOT として指定されたディレクトリを指していることを確認してください。
これらのステップを踏めば、MEDIA_ROOT が指し示す media ディレクトリが正しく設定され、Djangoがアップロードされたファイルを保存できるようになるはずです。
★デプロイ時の注意
以下pythonanywhereでの作業
■画像ファイルを読めるようにした際は、pythonanywhereで”仮想環境に入ってから”下記コマンドを実行する。
$workon ユーザ名.pythonanywhere.com
$pip install Pillow
■cssの変更を反映する場合
静的ファイルの更新をしたら、pythonanywhereのターミナルで以下を実行する
$python manage.py collectstatic
~中略~
This will overwrite existing files!
Are you sure you want to do this?
Type 'yes' to continue, or 'no' to cancel: [ここでyesと入力する]
※上記でもCSSが効かなかったが、ブラウザのキャッシュをクリアすると解決した。
基本的には、本番環境(この場合はPythonAnywhere)にデプロイする際に、セキュアな設定でアプリケーションを実行する必要があります
■DEBUGの無効化:
settings.pyファイル内のDEBUG = Trueの行をDEBUG = Falseに変更します。
ファイル:mysite/setting.py
変更箇所:DEBUG = True → DEBUG = False に変更
★★開発環境ではTrueにしておかないと、画像が表示されない設定となっている。