PythonのWebアプリケーションフレームワーク”Django”について無料で学習します。
今回は”DetailView”クラスについて学習します。
“DetailView”クラスは継承する事によってモデルクラスからPKに紐づくデータを全て引っ張る事が出来ます。
準備
※仮想環境”venv”にて進めます。
環境
環境 | version | 備考(コマンド) |
Rocky Linux | 8.4 | cat /etc/redhat-release |
Python | 3.6.8 | python -V |
Django | 3.2 | django-admin –version |
開発
urls
detail/<int:pk>/ #pkを渡す
orderPro/orderApp/urls.py
from django.urls import path
# view.pyをインポート
from . import views
# アプリ名を定義
app_name = "App"
# path(呼び出しアドレス, viewの呼び出す関数, path名)
urlpatterns = [
path("",views.Index.as_view(), name="index"),
path("userTrade/detail/<int:pk>/",views.UserDetail.as_view(), name="userTradeDetail"), # ユーザー詳細
path("detail/<int:pk>/",views.OrderDetail.as_view(), name="orderDetail"), # pk値に対してOrderDetailクラスが実行
]
vies
DetailViewクラスを継承。
models.userクラスを登録。pkに合わせて紐づくデータを引っ張る。
orderPro/orderApp/views.py
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse
from django.views.generic import TemplateView
from django.views.generic import ListView
from django.views.generic import DetailView
from . import models
class Index(ListView):
# Companyテーブル連携
model = models.user
# レコード情報をテンプレートに渡すオブジェクト
context_object_name = "user_list"
# テンプレートファイル連携
template_name = "AppHTML/index.html"
# ユーザー詳細
class UserDetail(DetailView):
# userテーブル連携
model = models.userTrade
# レコード情報をテンプレートに渡すオブジェクト
context_object_name = "user_detail"
# テンプレートファイル連携
template_name = "AppHTML/user_detail.html"
class OrderDetail(DetailView):
#userテーブル連携
model = models.user
#レコード情報をテンプレートに渡すオブジェクト
context_object_name = "order_detail"
#テンプレートファイル連携
template_name = "AppHTML/order_detail.html"
Template
# pkをorderDtailへ渡す。"detail/<int:pk>に渡る。
{% url 'App:orderDetail' userlist.pk %}
orderPro/Template/AppHTML/index.html
{% extends "AppHTML/header.html" %}
{% block content_block %}
<h2>受注一覧</h2>
<table class="table">
<thead>
<tr>
<th>ユーザー名</th>
<th>詳細参照</th>
</tr>
</thead>
<tbody>
{% for userlist in user_list %}
<tr>
<td>{{ userlist.name }}</td>
<td><a href="{% url 'App:orderDetail' userlist.pk %}">詳細</a></td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="container">
<br>
</div>
{% endblock %}
OrderDetailクラスで” context_object_name “へ設定した”order_detail”が”order_detail.name”になります。
” order_detail.User.all “は”User”はForeignkeyの”related_name”にあたります。
★Userはモデルクラスの"orderItem"の"related_name='User'"に該当する。
user = models.ForeignKey(user,related_name='User',on_delete=models.CASCADE, null=True, blank=True)
orderPro/Template/AppHTML/order_detail.html
{% extends "AppHTML/header.html" %}
{% block content_block %}
<div class="jumbotron">
<h2>ユーザー詳細</h2>
<table class="table">
<thead>
<tr>
<th scope="col">ユーザー</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ order_detail.name }}</td>
</tr>
<tbody>
</table>
<div class="container">
<br>
</div>
<h2>受注一覧</h2>
<table class="table">
<thead>
<tr>
<th scope="col">記入日</th>
<th scope="col">納入日</th>
<th scope="col">納入日(変更)</th>
<th scope="col">仕入れ先</th>
<th scope="col">商品 </th>
<th scope="col">規格</th>
<th scope="col">数量</th>
<th scope="col">仕入れ値</th>
<th scope="col">売り値</th>
<th scope="col">利益</th>
<th scope="col">備考</th>
</tr>
</thead>
<tbody>
{% for order in order_detail.User.all %}
<tr>
<td>{{ order.createdDate }}</td>
<td>{{ order.deliveryDate }}</td>
<td>{{ order.deliveryDateSub }}</td>
<td>{{ order.supplier }}</td>
<td>{{ order.item }}</td>
<td>{{ order.size }}</td>
<td>{{ order.quantity }}</td>
<td>{{ order.purchasePrice }}</td>
<td>{{ order.sellingPrice }}</td>
<td>{{ order.profit }}</td>
<td>{{ order.remarks }}</td>
</tr>
{% endfor %}
<tbody>
</table>
<div class="container">
<br>
</div>
</div>
{% endblock %}
orderPro/Template/AppHTML/user_delete.html
{% extends "AppHTML/header.html" %}
{% block content_block %}
<h1>本当に削除しますか?</h1>
<form method="post">
{% csrf_token %}
<input type="submit" class="btn btn-danger" value="削除">
<a href="{% url 'userTradeDetail' pk=user_delete.pk %} ">キャンセル</a>
</form>
{% endblock %}
コメント