venvで仮想環境の作成
Djangoでの開発手順
プロジェクトフォルダの立ち上げ
venvでの仮想環境の作成
プロジェクトの立ち上げ
mainフォルダの作成
プロジェクト立ち上げ直後の初期設定
メディア・スタティックフォルダの作成
アプリケーションの立ち上げ
1 |
python manage.py startapp [アプリケーション名] |
main内のurls.pyにアプリケーションを登録
・フォルダツリーに新規追加はなし
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
プロジェクトフォルダ ├ーsrc | ├main | |├__pycache__ | |├__init.py__ | |├asgi.py | |├settings.py | |├urls.py #編集。ブラウザからのアクセス、アプリケーションへの紐づけに[1]を使用する | |└wsgi.py | | | ├media_local | ├static_local | ├manage.py | └アプリケーションフォルダ[1] | ├__pycache__ | ├__init__.py | ├admin.py | ├apps.py | ├models.py | ├tests.py | └views.py | | └venv_アプリケーション名 ├include ├Lib ├Scripts └pyvenv.cfg |
■mainフォルダ内のurls.pyに追記
・プロジェクトフォルダ>src>main>urls.py
1 2 3 4 5 6 7 8 9 10 |
from django.contrib import admin from django.urls import path, include urlpatterns = [ #ブラウザからの開発用サーバーアクセス時のURL。http:\\127.0.0.1:8000\admin/ path('admin/', admin.site.urls), #第一・第二引数の[アプリケーションへフォルダ名]はフォルダツリー内[1] #ブラウザからの開発用サーバーアクセス時のURL。http:\\127.0.0.1:8000\[アプリケーションフォルダ名]/ path('[アプリケーションフォルダ名]/', include('[アプリケーションフォルダ名].urls')), ] |
・2行目のライブラリのインポートに”include”を追記
・urlpatternsにアプリケーションフォルダ内のurls.pyを見に行く指示を追記↓
“path(‘[アプリケーションフォルダ名]/’, include(‘[アプリケーションフォルダ名].urls’)),”
・開発用サーバーを立ち上げて実際の画面を確認するには末尾に[アプリケーションフォルダ名]を入れる
例:http://127.0.0.01:8000/アプリケーションフォルダ名/
・この時点ではアプリケーションフォルダ内のurls.py,views.py,テンプレートがないので、開発用サーバーを立ち上げても404エラーが帰ってくる。
アプリケーションフォルダ内のurls.pyを作成
■アプリケーションフォルダ内にurls.pyを新規作成
・フォルダツリー
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
プロジェクトフォルダ ├ーsrc | ├main | |├__pycache__ | |├__init.py__ | |├asgi.py | |├settings.py | |├urls.py | |└wsgi.py | | | ├media_local | ├static_local | ├manage.py | └アプリケーションフォルダ | ├__pycache__ | ├__init__.py | ├admin.py | ├apps.py | ├models.py | ├tests.py | ├views.py | └urls.py #新規作成 | └venv_アプリケーション名 ├include ├Lib ├Scripts └pyvenv.cfg |
■アプリケーションフォルダ内のurls.pyに次のコードを記載
・プロジェクトフォルダ>src>アプリケーションフォルダ>urls.py
1 2 3 4 5 |
from django.urls import path urlpatterns = [ ] |
・urlpatterns内は今は空欄でOK。後でここにhtmlファイルなどへのパスを追記していく。
・urlpatternsが空欄で何にも紐づけられていないので、この時点では開発用サーバーを立ち上げても404エラーが帰ってくる。
アプリケーションフォルダ内でtemplatesフォルダを作成
アプリケーションフォルダ内でtemplatesフォルダを作成
■以下2つのフォルダを作成
・アプリケーションフォルダ内でtemplatesフォルダ
・templatesフォルダ内で[アプリケーションフォルダ名]_templates
・作成後のフォルダ構成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
プロジェクトフォルダ ├ーsrc | ├main | |├__pycache__ | |├__init.py__ | |├asgi.py | |├settings.py | |├urls.py | |└wsgi.py | | | ├media_local | ├static_local | ├manage.py | └アプリケーションフォルダ | ├__pycache__ | ├__init__.py | ├admin.py | ├apps.py | ├models.py | ├tests.py | ├views.py | ├urls.py | └templates #新規作成 | └[アプリケーションフォルダ名]_templates #新規作成 | └venv_アプリケーション名 ├include ├Lib ├Scripts └pyvenv.cfg |
?htmlファイルなどはtemplatesフォルダ内にまとめておく理由を調べる
?templatesフォルダ内で、さらにフォルダを作成している理由を調べる
アプリケーションフォルダのurls.pyからテンプレートファイルとvies.pyへ紐づけ
アプリケーションフォルダ内のテンプレートフォルダ内に新しくhtmlファイルなどを作成した場合のurls.pyからの紐づけ方法について。
■htmlファイルを作成する
・templates>[アプリケーションフォルダ名]_templatesの中に新しくhtmlファイルを作成
・今回はindex.htmlを作成したものとする
・フォルダツリー内の[2]はviews.py編集時に使用する
・作成後のフォルダ構成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
プロジェクトフォルダ ├ーsrc | ├main | |├__pycache__ | |├__init.py__ | |├asgi.py | |├settings.py | |├urls.py #[1]を引数に取る | |└wsgi.py | | | ├media_local | ├static_local | ├manage.py | └アプリケーションフォルダ #[1]mainフォルダ内のurls.pyの第一引数になる | ├__pycache__ | ├__init__.py | ├admin.py | ├apps.py | ├models.py | ├tests.py | ├views.py #編集 | ├urls.py #編集 | └templates #[3] | └[アプリケーションフォルダ名]_templates #[2]views.pyでの第二引数の一部 | └[ファイル名].html #新規作成。今回はindex.htmlとする | └venv_アプリケーション名 ├include ├Lib ├Scripts └pyvenv.cfg |
■vies.pyで関数を作成
・プロジェクトフォルダ>src>アプリケーションフォルダ>views.py
1 2 3 4 5 6 7 |
from django.shortcuts import render # Create your views here. #index関数を新規作成。index.htmlを返す。 def index(request): #renderの第二引数はtemplatesフォルダからのパスを記載 return render(request, "[フォルダツリー[2]のフォルダ名]/index.html") |
・urls.pyから接続リクエストを受けて、index.htmlを返すべき内容として渡す。
・今は何も処理を行っていないが、いわゆるビジネスロジックを後々index関数にさらに追記したり、別の関数を追加することで変数requestに載せる情報が増えていく。
・”return render(request, “[フォルダツリー[2]のフォルダ名]/index.html”)”は、第一引数にリクエスト時に渡された情報を持つ。また第二引数にはtemplatesフォルダ[3]からのパスを記載。
■urls.pyでviews.pyとhtmlファイルへ紐づけ
・プロジェクトフォルダ>src>アプリケーションフォルダ>urls.py
1 2 3 4 5 6 7 8 9 |
from django.urls import path from .views import index #views.pyからindex関数をインポート urlpatterns = [ #第一引数はURL、第二引数はvies.pyからインポートした関数名 #indexはこのファイルの冒頭でviewsからインポートしている。 #ブラウザから開発用サーバーにアクセスする際はhttp:\\127.0.0.1:8000/アプリケーション名/ path("", index), ] |
・冒頭、以下の通りviews.pyからindex関数をインポートしている。
”from .views import index”
・urlspatternsにviews.pyのどの関数へ紐づけるかを記載。第一引数がURL、第二引数がviews.py内の関数
”path(“”, index),”
・開発用サーバーを立ち上げた際は以下がURLになる。
“http:\\127.0.0.1:8000/アプリケーション名/”
・上記のURLはこれは、pathの第一引数を返すと変化する
“http:\\127.0.0.1:8000/アプリケーション名/[pathの第一引数]”
・ここまで、アプリケーションフォルダ内のurls.pyからviews.py内の関数とhtmlファイルへの紐づけを行ったことで、開発用サーバーを立ち上げてアクセスすることができるようになる。
・今後、view.pyへの関数の追加、htmlファイルの追加を行ったときは今回と同様にアプリケーションフォルダ内のurls.pyからそれぞれ紐づけを行う。
models.pyでモデルクラスを作成
・フォルダツリー。変更なし
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
プロジェクトフォルダ ├ーsrc | ├main | |├__pycache__ | |├__init.py__ | |├asgi.py | |├settings.py | |├urls.py | |└wsgi.py | | | ├media_local | ├static_local | ├manage.py | └アプリケーションフォルダ | ├__pycache__ | ├__init__.py | ├admin.py | ├apps.py | ├models.py #編集 | ├tests.py | ├views.py | ├urls.py | └templates | └[アプリケーションフォルダ名]_templates | └[ファイル名].html | └venv_アプリケーション名 ├include ├Lib ├Scripts └pyvenv.cfg |
■models.pyを編集
・プロジェクトフォルダ>src>[アプリケーションフォルダ]>models.py
1 2 3 4 5 |
from django.db import models class [モデルクラス名](models.Model): title = models.CharField(max_length=50) content = models.CharField(max_length=500) |
・Modelクラスを継承したクラスを作成
・モデルクラス名は自由に決められる
?どのようなフィールド(ModelField)が使えるか要確認
モデルクラスをmigrationsファイルへ変換
■コマンドプロンプトで以下を実行
・コマンドプロンプト:プロジェクトフォルダ>src
1 |
python manage.py make migrations |
・models.pyに記載したモデルクラスをmigrationsファイルへ反映している。
・次にmigrateコマンドを実行することで実際にDBへの書き込みを行う。
DBへ書き込み
■コマンドプロンプトで以下を実行
・コマンドプロンプト:プロジェクトフォルダ>src
1 |
python manage.py migrate |
・migrationsファイルの内容をDBへ実際に書きこんでいる
DBにカラムを追加
その他
コマンドラインラインでshellを使ってデータを登録
■コマンドプロンプトで以下実行
・コマンドプロンプト:プロジェクトフォルダ>src
1 |
python manage.py shell |
・shellを起動。データの読み込みや書き込み等ができる
■データの登録
1 2 3 4 5 6 |
#アプリケーションフォルダ内のmodels.pyに定義されているモデルクラス名をインポート from [アプリケーション名].models import [モデルクラス名] #field1,field2はモデルクラスに定義されている各フィールド。2つとは限らない。またvalue1,value2はDBに登録する値 object = [モデルクラス名](field1 = value1, field2 = value2) #saveメソッドでデータをDBに保存 object.save() |
・ベースフォルダはmanage.pyのあるフォルダ。shellを実行するときはこのフォルダが起点になる。
models.pyはベースフォルダから出発してアプリケーションフォルダ内の中にあるので、下記のように”[アプリケーションフォルダ名].models”としてパスを指定する。その後、models.pyの中で定義されているクラス名を指定してインポートする。
“from [アプリケーション名].models import [モデルクラス名]”
・変数objectはこれからデータベースに登録されるデータを保持するオブジェクト。その属性としてfield1,field2を持ち、モデルクラスに定義されている各フィールドを示す。開発者が2つ以上のフィールドを定義した場合は、引数がさらに増えることになる。
またvalue1,value2はDBに登録する値
コマンドラインラインでshellを使ってデータを取得
■コマンドプロンプトで以下実行
・コマンドプロンプト:プロジェクトフォルダ>src
1 |
python manage.py shell |
・shellを起動。データの読み込みや書き込み等ができる
■データの取得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#アプリケーションフォルダ内のmodels.pyに定義されているモデルクラス名をインポート from [アプリケーション名].models import [モデルクラス名] #idが1のデータを取得 object = [モデルクラス名].objects.get(id=1) #取得したオブジェクト(データ)の各フィールドを出力 print(object.field1) print(object.field2) print(object.field3) #全てのデータを取得 objects = [モデルクラス名].objects.get.all() #全データを取得した場合はfor文で回すことができる(イテレータオブジェクトになる) for object in objects: #objectはループ変数。それぞれのフィールドを表示する print(object.field1) print(object.field2) |