Django Girls and Boys 備忘録

Python、Selenium、Django、java、iPhoneアプリ、Excelマクロなどで気付いたこと、覚えておきたいことなどを載せていきます。

【Python】Djangoでのhtml側からの指定とurlsでの記載方法

 

 

今回は、わかりにくかったhtmlファイルからDjangoのurls.pyでの指定を経由してviews.pyの関数を呼び出し応答をもらう時のurls.py、views.pyでの記述例となります。備忘録として残しておきます。

 

目次

 

urls.py

 

まずはじめに、Djangoでのデータの流れはざっと下のようになります。

 

Djangoでのデータの流れ

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 備忘録