今回は、わかりにくかったhtmlファイルからDjangoのurls.pyでの指定を経由してviews.pyの関数を呼び出し応答をもらう時のurls.py、views.pyでの記述例となります。備忘録として残しておきます。
目次
urls.py
まずはじめに、Djangoでのデータの流れはざっと下のようになります。
1.html側からhttpリクエストを送信
2.urlsにてリクエストの内容からurlpatternsを検索して適合するviews内の関数を見つけ出し実行
3.views内関数はmodels内のモデルからデータ、templateフォルダからテンプレートを取得、演算などを実施してコンテキストとしてhtml側にレスポンスとして返す
という流れになります。
urls.pyは、プロジェクトフォルダのurls.pyとアプリケーションフォルダのurls.pyとがあります。
プロジェクトフォルダのurls.pyには、
path('',admin.site.urls),
のみ記述されています。
ここに以下のように今回自分たち用のアプリケーションbattleのurls.pyと連結するpathを追加します。
urls.py(プロジェクトフォルダ)
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('battle.urls')), ]
次に、アプリケーションフォルダbattle側のurls.pyでは、アプリケーション名として、
app_name='battle'
と設定された後のurlpatternsにviews内の関数へのpathを指定していきます。
pathの中身は、
path(url,関数またはクラス,name=url名称)
となります。
以下の1行目は、views内のindex関数を指定し、nameとしてもindexという名前を付けています。
同様に2行目は、views内のweaponSelect関数を指定し、nameとしてもweaponSelectという名前を付けています。
urls.py(アプリケーションフォルダbattle)
from django.urls import path from . import views app_name = 'battle' urlpatterns = [ path('', views.index, name='index'), path('<int:id>/weaponSelect/', views.weaponSelect, name='weaponSelect'), ]
これに対して、html側ではたとえば以下のように指定します。
html側のコードには5行目あたりからボタン(選択ボタン)とその動作が記述されています。
<form method="POST" action="{% url 'battle:weaponSelect' weapon.pk %}>
という行がありますが、action=の中身がクリックされた時の動作となります。
'battle:weaponSelect' の部分は、battleがurls内のapp_name、weaponSelectがその中のPATH指定の中のnameを表しています。
これにより、この選択ボタンがクリックされた時には、urls側ののpathを上から順に探していき、nameとしてweaponSelectとある2つ目のpathが該当するため、ここに指定されている関数であるviews内のweaponSelect関数が実行されます。
また、html側に指定のあるweapon.pkが引数として関数に渡されます。
html
weaponSelect.html
<h1>名前:{{name}}</h1><br> {% for weapon in wpns %} 攻撃力:{{weapon.attackPower}}<br> 防御力:{{weapon.defensePower}}<br> <form method="POST" action="{% url 'battle:weaponSelect' weapon.pk %}"> {% csrf_token %} <button id="button1" type="submit"><span style="color:red">選択</span></button> </form> {% endfor %}
view.py側のweaponSelect関数にはたとえば以下のように記述されています。
この中で引数idには先程のweapon.pkが渡されます。
viewsの関数側ではhtmlからのリクエストに対して、このweaponSelect関数が実行され、レスポンスとしてweaponSelect.htmlへコンテキストtxt(この場合、リスト型のtxtにwpnsとwpnNameがそれぞれ'wpns','name'という名前をつけて入っている)をつけて返します。
views.py
views.py
def weaponSelect(request, id): weapon = get_object_or_404(Weapon,pk=id) wpnName = weapon.name wpns = Weapon.objects.order_by('name') txt = { 'wpns': wpns, 'name': wpnName, } return render(request, 'weaponSelect.html', txt)
以上が大まかな流れと記述方法の例となります。
関係記事:
【Python】Djangoでのモデル定義 (models.py内でのモデル作成) - Django Girls and Boys 備忘録
【Python】Djangoのモデル(models.py)変更でのデータベースファイル更新手順 - Django Girls and Boys 備忘録
【Python】Djangoモデル(models.py)のviews.pyからの操作方法 - Django Girls and Boys 備忘録
【Python】Djangoのviews.pyとhtmlファイル、htmlファイルとurls.pyとの間の受け渡し例 - Django Girls and Boys 備忘録
【Python】Djangoでのhtml側からの指定とurlsでの記載方法 - Django Girls and Boys 備忘録