Django Girls and Boys 備忘録

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

【Python】Djangoのviews.pyとhtmlファイル、htmlファイルとurls.pyとの間の受け渡し例

 

今回の内容は比較的わかりにくかったDjangoのviews.pyとhtml側との間の変数などの受け渡しでhtml側でどのように記述してそれらを使っていったらいいかという内容を例を挙げて備忘録として残しておきます。

最後に、そのhtml側の記載内容に対応したurls.py側での記載内容も例を挙げて残しておきます。

目次

 

views.py

 

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)

 

以上のようにviews.py側で記載された内容に対するhtmlファイルであるweaponSelect.html側での記載の一例としては以下のようになります。

 

html

 

変数'name'については、html側で二重括弧{{}}で囲むことで指定できます。

リスト型の変数wpnsについては、for分を使用して以上のように個別に取り出すなどして操作、処理することができます。

 

weapon.pkはwpnsに入っていた各weaponについているwpns内での通し番号です。

weapon.attackPower、weapon.defensePowerは、リスト型変数であるモデルweaponが持っている変数attackPower、defensePowerを表示するものです。

 

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 %}

 

この結果としては、weaponSelect.html内に、weapon内の登録武器の個数分だけattackPower、defensePowerと選択ボタンが繰り返し表示されると思います。

 

また、ここのコードに記載のあるボタン(選択ボタン)の動作としては、以下のようになります。

 

<form method="POST" action="{% url 'battle:weaponSelect' weapon.pk %}>

という行がありますが、action=の中身がクリックされた時の動作となります。

 

  'battle:weaponSelect' の部分は、battleがurls内のapp_name、weaponSelectがその中のPATH指定の中のnameを表しています。

 

urls.py

 

urls.py側はたとえば以下のような記載となります。

この場合、app_nameがbattleとなっており、html側から 'battle:weaponSelect' と指定された場合は、このapp_nameのurlpatterns内の行を上から順番に見ていき、nameがweaponSelectの行を実行するため、今回の場合はpath指定の2行目が該当し、実行関数指定がviews.weaponSelectということで、views.py内のweaponSelectが実行されます。

 

urls.py

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'),
]

 

 

関係記事:

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