djangoでDetailViewを使ってみる

2022年5月3日

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

2022年5月3日