venvで仮想環境の作成
- Djangoでの開発手順
- プロジェクトフォルダの立ち上げ
- venvでの仮想環境の作成
- プロジェクトの立ち上げ
- mainフォルダの作成
- プロジェクト立ち上げ直後の初期設定
- メディア・スタティックフォルダの作成
- アプリケーションの立ち上げ
- main内のurls.pyにアプリケーションを登録
- アプリケーションフォルダ内のurls.pyを作成
- アプリケーションフォルダ内でtemplatesフォルダを作成
- アプリケーションフォルダのurls.pyからテンプレートファイルとvies.pyへ紐づけ
- models.pyでモデルクラスを作成
- モデルクラスをmigrationsファイルへ変換
- migrationsファイルの内容をDBへ書き込む
- DBにカラムを追加
- 新規登録画面を作成
- 他のページへのリンクを作成する
- その他
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): [属性1] = models.CharField(max_length=50) [属性2] = models.CharField(max_length=500) |
・Modelクラスを継承したクラスを作成する
・モデルクラス名はデータベースが持つ各テーブルを指し、自由に決めることができる。学生の成績を管理するデータベースの場合は、学生と成績の2つのテーブルに分けることができる。これらをモデルクラス名としてそれぞれ定義することになる。
・[属性1]と[属性2]はテーブルが持つデータ。列名のイメージ
学生というテーブルがある場合は、名前、学籍番号、年次などにあたる
?どのようなフィールド(ModelField)が使えるか要確認
モデルクラスをmigrationsファイルへ変換
■コマンドプロンプトで以下を実行
・コマンドプロンプト:プロジェクトフォルダ>src
1 |
python manage.py make migrations |
・models.pyに記載したモデルクラスをmigrationsファイルへ反映している。
・次にmigrateコマンドを実行することで実際にDBへの書き込みを行う。
migrationsファイルの内容をDBへ書き込む
■コマンドプロンプトで以下を実行
・コマンドプロンプト:プロジェクトフォルダ>src
1 |
python manage.py migrate |
・migrationsファイルの内容をDBへ実際に書きこんでいる
DBにカラムを追加
新規登録画面を作成
いわゆるCRUD機能のうち、C(Create)の部分を作る。
登録用画面(htmlファイル)を作り、views.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 29 30 31 32 |
プロジェクトフォルダ ├ー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 | └[新規登録用ファイル名].html #追加。 | └venv_アプリケーション名 ├include ├Lib ├Scripts └pyvenv.cfg |
■新規登録用のhtmlファイルを作成
・プロジェクトフォルダ>src>[アプリケーションフォルダ]>templates>[アプリケーションフォルダ名]_templates>[新規登録用ファイル名].html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<!doctype html> <html lang="ja"> <head> <meta charaset="utf-8"> <meta namae="viewport" content="width=device-width, initial-scale=1"> <title>[タイトル]</title> </head> <body> <h1>登録用画面</h1> <form method="POST">{% csrf_token %} <div> <input name="[フォーム名称1]" type="text" placeholder="[フォーム内に表示する言葉1]"/> </div> <div> <input name="[フォーム名称2]" type="text" placeholder="[フォーム内に表示する言葉2]" > </div> <button type="submit">登録</button> </body> </html> |
・フォームとは利用者が入力する項目のこと、入力欄を用意し、アプリケーション側に送信することで必要なデータを指定して取得したり、データの登録・更新・削除などを行うことができる。
・<form method=”POST”>はこのフォームがPOSTメソッドを使うことを示す。アプリケーションはif文などを使いPOSTメソッドであることを把握した上で、データの登録や更新の処理を行う。
・{% csrf_token %}はPOSTメソッドを使う時に使用する。
・<div>~</div>は、このタグで囲った内容をグループ化し、CSSでスタイルを適用したりJavaScriptで操作したいときに使う。
・inputタグはテキスト入力用のフィールドを用意する。1行のみであり、複数行は入力できない。
name=”[フォーム名称]”は、[フォーム名称]の部分は自由入力。POSTメソッドで送信後、views.pyででこの名称を使ってこの画面(htmlファイル)のどのフォーム
■views.pyで新規登録を行う関数を作成
・プロジェクトフォルダ>src>[アプリケーションフォルダ]>views.py
1 2 3 4 5 6 7 8 9 |
from .models import [モデルクラス] def [新規登録用関数](request): template_name = "[アプリケーションフォルダ名]_templates/[新規登録用ファイル名].html" if request.POST: [フォーム用変数1] = request.POST["[フォーム名称1]"] [フォーム用変数2] = request.POST["[フォーム名称2]"] object = [モデルクラス]([モデルクラスの属性1]=[フォーム用変数1], [モデルクラスの属性2]=[フォーム用変数2]) object.save() return render(request, template_name) |
・if request.POSTで、POSTメソッドの場合に、以降の処理を行うように定義している。
・[フォーム名称1,2]はhtmlファイルから渡された利用者の入力内容。今回の例では[新規登録用ファイル名].htmlに表示されている2つの入力用フォームのそれぞれのinputタグに入力されたデータを受け取っている。
・[モデルクラス]はmodels.pyで定義したクラス名。インポートしておく必要がある(1行目の部分)。[モデルクラス]の各属性にそれぞれ利用者の入力データをインスタンス変数objectに引数として渡す。
・object.save()でインスタンス変数objectの内容をデータベースに登録する。
■urls.pyでviews.pyへ紐づける
・プロジェクトフォルダ>src>[アプリケーションフォルダ]>urls.py
1 2 3 4 5 6 7 |
from django.urls import path from .views import [views.pyの新規登録用関数] urlpatterns = [ ・・・ path("[新規登録用のURL]/", [views.pyの新規登録用関数], name="[名称]"), ] |
・urls.pyで、path関数を使って新しいURLパターンを作成する。
・第一引数には[新規登録用のURL]を指定する。自由に決めてよい。
・第二引数には[views.pyの新規登録用関数]を指定。views.pyで先ほど作成した関数を指定する。インポートが必要(2行目)。
・第三引数にはname属性を指定。このURLパターンの名前を決めている。自由に決めてよい。
他のページへのリンクを作成する
・フォルダツリー。変更なし
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 |
■urls.pyのメソッド・関数にname属性で名前を付与する
・プロジェクトフォルダ>src>[アプリケーションフォルダ]>urls.py
1 2 3 4 5 6 7 8 |
from django.urls import path #from .views import IndexView, WordListView, English_to_Japanese, Word_Create_View #index from .views import index, WordListView, English_to_Japanese, Word_Create_View #index urlpatterns = [ path("[URLパターン]/", [views.pyの関数orメソッド名], name="[名前1]"), path("[URLパターン]/", [views.pyの関数orメソッド名], name="[名前2]"), ] |
・path関数の第三引数のname属性を指定して各URLパターンに名前を付ける。
・htmlファイルなどから、ここでつけた名前を指定してそれぞれのhtmlファイルへリンクすることができる。
■htmlファイルにAタグとDjangoのテンプレートシステムを使ってリンクをはる
・プロジェクトフォルダ>src>[アプリケーションフォルダ]>templates>[アプリケーションフォルダ]_templates>[任意のhtmlファイル名].html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<!doctype html> <html lang="ja"> <head> ・・・ </head> <body> <h1>トップページ</h1> <a href="{% url '[名前1]' %}">リンクテキスト1</a> <a href="{% url '[名前2]' %}">リンクテキスト2</a> </body> </html> |
・[名前1,2]はurls.pyのpath関数でname属性で付けた名前を記述する。以下の[・・・]の部分に記述。
・{{% url ‘[・・・]’ %}}
・リンクテキストは自由に決めてよい。
その他
コマンドラインラインで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) |