djangoでDetailViewを使ってみる
djangoでDetailViewを使ってみる
DetailViewはURLパターンからプライマリーキーを取得してそのレコードを取得してくれるViewです。イメージは次の通りです。
ブログの一覧画面があります。この右のほうにリンク付きのIDがあるのでクリックします。
クリックするとそれに応じたデータを取得して表示してくれます。
url.py
url.pyでは「ブログのタイトルページ」と「ブログの詳細ページ」を用意しました。
注目しておくのは「<int:pk>」の部分です。この部分がテンプレートからプライマリーキーを受け取りViewに送るのを実現しています。
例でいうと下の通りです。
IDの「1」がクリックされる→「http://127.0.0.1:8001/app/blog_detail/1/」
IDの「2」がクリックされる→「http://127.0.0.1:8001/app/blog_detail/2/」
from django.urls import path
from . import views
app_name = 'app'
urlpatterns = [
path('blog_title/', views.blog_title, name='blog_title'),
path('blog_detail/<int:pk>/', views.blog_detail, name='blog_detail'),
]
views.py
views.pyは下の通りです。
それぞれクラスを継承してテンプレートに飛ばしてあげているだけの書き方になっています。
from django.shortcuts import render
from django.views import View
from django.views.generic import ListView
from django.views.generic import DetailView
from app.models import Blog
class BlogTitle(ListView):
model = Blog
template_name = 'app/blog_title.html'
blog_title = BlogTitle.as_view()
class BlogDetail(DetailView):
model = Blog
template_name = 'app/blog_detail.html'
blog_detail = BlogDetail.as_view()
blog_title.html
タイトル一覧画面の方で注目するのは「{% url 'app:blog_detail' blog.pk %}」の部分です。
リンクがクリックされたときに該当するデータの「プライマリーキー」をURLに付与しています。
{% extends 'app/base.html' %}
{% block content %}
<table>
<tr>
<th>TITLE</th>
<th>ID</th>
</tr>
{% for blog in object_list %}
<tr>
<td>{{ blog.title }}</td>
<td><a href="{% url 'app:blog_detail' blog.pk %}">{{ blog.pk }}</td>
</tr>
{% endfor %}
</table>
{% endblock %}
blog_detail.html
詳細画面では「プライマリーキー」で取得されるたデータの「1つのレコード」が表示されます。
{% extends 'app/base.html' %}
{% block content %}
<table>
<tr>
<th>TITLE</th>
<th>TEXT</th>
<th>CREATE</th>
<th>UPDATE</th>
</tr>
<tr>
<td>{{blog.title}}</td>
<td>{{blog.text}}</td>
<td>{{blog.created_datetime}}</td>
<td>{{blog.updated_datetime}}</td>
<tr>
</table>
{% endblock %}
ディスカッション
コメント一覧
まだ、コメントがありません