Django

Django 簡単なアプリを作って基礎を覚える⑤ DetailViewを作成

前回は登録している情報をリストとして表示するところまでやりました。

今回は、詳細画面を作ってリストから遷移できるようにしようと思います。

詳細画面を作成する

詳細画面をListViewと同じようにDjangoが持っている機能があります。

それを利用しながら実装しようと思います。

viewsファイル

それでは、listを作成した時と同じように、viewsに追記しましょう❕

from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic import ListView, DetailView #追記
from .models import TaskModel


def helloworld(request):
    hello_display = HttpResponse("Hello World")
    return hello_display

class TaskList(ListView):
    template_name = "list.html"
    model = TaskModel
#追記
class TaskDetail(DetailView):
    template_name = "detail.html"
    model = TaskModel

表示するためのhtmlファイルを作成しましょう。

temlatesフォルダにdetail.htmlというファイルを作成しましょう。

次は、detail.htmlの中に詳細情報を表示するためのコードを書いていこうと思います。

{{ object.title }}
{{ object.memo }}
{{ object.user }}
{{ object.plants_startdate }}
{{ object.plants_enddate }}

リストの場合は、3つの登録している内容を表示するために、for 文で順番にデータを取りだして表示していました。

今回は、リストから選択したレコードの詳細画面になるので、データはひとつしかないため、forで順番に取り出す必要がないのです。

urls.py にdetailを追加する

最後に、監督であるurls.pyにdetailがあることを知ってもらいます。

from django.urls import path, include
from .views import helloworld, TaskList, TaskDetail #追記

urlpatterns = [
    path('hello/', helloworld),
    path('list/', TaskList.as_view(), name='list'),
    path('detail/', TaskDetail.as_view(), name='detail') #追記
]

viewsに追加した、TaskDetailを追加してurlがdetailなら、TaskDetailを動かす指示を追加しました。

これでランサーバーをして確認してみましょう❕

python manage.py runserver

それでは、アクセスしてみましょう❕

http://127.0.0.1:8000/task/detail/

そうすると、エラー画面になっちゃいました🥶

何でかわかりますか❓ ヒントは、detail.htmlの時の解説にあります…

今回は、listの中からひとつ選ばれたものの詳細画面を開くことになります。

でも、監督はどのレコードが選択されたのかわからないのです…🙄

ポイント

レコードを選択しての詳細画面は、どのレコードを選択したのか連携してあげる必要がある❕

こういうことなんですね。

では、どのレコードを受け渡したかを連携するには、特定することのできるキーを受け渡す必要があります。

from django.db import models
from django.contrib.auth.models import User

class TaskModel(models.Model):
    title = models.CharField(verbose_name='タイトル', max_length=100,  null=True)
    memo = models.TextField(verbose_name='内容', blank=True, null=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='担当者',blank=True, null=True)
    plants_startdate = models.DateField(verbose_name='開始予定日', blank=True, null=True)
    plants_enddate = models.DateField(verbose_name='終了予定日', blank=True, null=True)

    def __str__(self):
        return self.title

Djangoでテーブルを作成した時に、primarykeyというものを指定していなかったら裏で自動で作られて、1から順番にレコードを追加するごとに順番に値がとられています。

管理画面で開いてみると、上のURLにtaskmodelのあとに、『3』となっています。これが内部で自動でとっているプライマリーキーになります。

詳細画面に遷移するときに、どのレコードかの情報を連携するためにはこのプライマリーキーを連携する必要があります。

流でいうと

list からプライマリーキーを詳細画面に渡す ⇒ 詳細画面は、プライマリーキーを受け取って表示する

受け取り方からやります。

urls.pyを修正します。

from django.urls import path, include
from .views import helloworld, TaskList, TaskDetail

urlpatterns = [
    path('hello/', helloworld),
    path('list/', TaskList.as_view(), name='list'),
    path('detail/<int:pk>', TaskDetail.as_view(), name='detail')
]

<int:pk>とすることで、数字型のプライマリーキーを受け取って、詳細画面を呼び出してね!ってなります。

それでは、urlにプライマリーキーをつけて、ひらいてみましょう❕

表示されるましたね😀これは、選手のリストから、選手の詳細情報を教えて!と言われても、どの選手のかわからないので、番号を言ってもらって選手を特定するって感じですね!

ポイント

対象データを特定するためには、プライマリーキーをつける必要がある

色んなやり方があるので、一概には言えませんが、1番シンプルな方法ですの覚えておいてください。

リストから詳細画面に遷移できるようにする

詳細画面は、プライマリーキーを渡せば表示されるようになりました。

リストの方に、選ばれたもののプライマリーキーを渡して詳細画面を表示して、という風に変更したいと思います。

list.htmlファイルに情報を追加します。

{% for task in object_list %}
    <p><a href="{% url 'task:detail' task.pk %}">{{ task.title }}</a>{{ task.user }}</p>
{% endfor %}

a href は、リンクをつけることを指示しています。そして、task の detailへのリンクとtask のpk プライマリーキーをリンク先としてね!という意味です。

しかし、ここでひとつ問題があります。task というものは、どこにあるのか分かっていません。それを教えてあげる必要があります。

urls.py にアプリ名をつけて、他の処理時に探せるようにしてあげる

教え方は簡単です。

from django.urls import path, include
from .views import helloworld, TaskList, TaskDetail

app_name = 'task' #追記
urlpatterns = [
    path('hello/', helloworld),
    path('list/', TaskList.as_view(), name='list'),
    path('detail/<int:pk>', TaskDetail.as_view(), name='detail')
]

app_name = 'task' としてあげると、他からここがタスクという場所で、detailもその中にいるなってわかるようになります。

これで、listを開いてみましょう😃

タイトル名が、青くなっていてリンクが貼られています。クリックするとそれぞれの詳細画面に遷移できるようになりました😁

上のurlにプライマリーキーが渡されていることがわかりますね😆

今回はここまでです。

次回は、見た目を整える作業をしていきましょう😉

Django 簡単なアプリを作って基礎を覚える⑥ Bootstarpを使って見た目を整える

今回は、見た目をよくしていきたいと思います。 もくじ1 Bootstarpを使って見た目を整える1.1 base.html ファイルを作成する1.2 base.html を読み込みしつかう1.3 詳細 ...

続きを見る

-Django

© 2021 ごろう@縁紡ぐ