Djangoでくじ引きアプリを作ってみる_part6

lottery-146318_1280.png Django

前回の続きで、くじ引きアプリを作成していきます。

【前回のまとめ】

・削除ページを作成する

【今回の作業】

・くじ引き実行ページを作成する

今回は、くじ引きの内容の中から一つだけ表示するための実行ページを作成したいと思います。

設定は今までの差分を利用しますので、初めから設定したい方は以下記事を参照してください。

Djangoでくじ引きアプリを作ってみる_part1

Djangoでくじ引きアプリを作ってみる_part2

Djangoでくじ引きアプリを作ってみる_part3

Djangoでくじ引きアプリを作ってみる_part4

Djangoでくじ引きアプリを作ってみる_part5

・くじ引き実行ページを作成する

【手順】

1.urls.pyを修正する

まずは実行ページ用のルーティングを作成します。

ファイル:myapptdl>tdl>url.py

コード:

from django.urls import path
from . import views

app_name = 'tdl'

urlpatterns = [
  path('', views.IndexView.as_view(), name='index'),
  path('execution/', views.ExecutionView.as_view(), name='execution'), #追加
  path('create/', views.CreateView.as_view(), name='create'),
  path('<int:pk>/update/', views.UpdateView.as_view(), name='update'),
  path('<int:pk>/delete/', views.DeleteView.as_view(), name='delete'),
]

urlpatternsに実行用のpathを作成しました。
これは、URLに「execution」が指定された場合、views.pyの「ExecutionView」クラス呼び出します。

2.views.pyを修正する

続いて、ExecutionViewクラスを作成します。

ファイル:myapptdl>tdl>views.py

コード:

from django.urls import reverse_lazy
from django.views import generic
from .models import Tdl
import random #追加

class IndexView(generic.ListView):
   model = Tdl

---ここから追加---
class ExecutionView(generic.ListView):
  model = Tdl
  template_name = 'tdl/tdl_execution.html'

  def get_queryset(self):
#    return Tdl.objects.order_by('?')[:1]
    pk = Tdl.objects.values_list('pk', flat=True)
    pk_list = list(pk)
    pk_random = random.choice(pk_list)
    queryset = Tdl.objects.filter(pk=pk_random)

    return queryset

---ここまで---
class CreateView(generic.edit.CreateView):
  model = Tdl
  fields = '__all__'

class UpdateView(generic.edit.UpdateView):
  model = Tdl
  fields = '__all__'

class DeleteView(generic.edit.DeleteView):
  model = Tdl
  success_url = reverse_lazy('tdl:index')

まずは、ランダムでデータを取り出すため、randomモジュールをインポートします。

そして新たに ExecutionViewクラスを追加しています。

クラスの中身は

‘tdl/tdl_execution.html’:テンプレート名
# return Tdl.objects.order_by(‘?’)[:1]:ランダムでデータを取り出す方法その1です。今回はこちらは使っていません。

pk = Tdl.objects.values_list(‘pk’, flat=True) :Djangoのクエリーをリスト形式で取得します。
https://dot-blog.jp/news/django-queryset-values-list/

pk_list = list(pk):取得したリストを変数へ保存しています。
pk_random = random.choice(pk_list) :ランダム関数で1つ取り出しています。
queryset = Tdl.objects.filter(pk=pk_random) :ランダムで取り出した値をオブジェクトとして取り出しています。

3.tdl_execution.htmlを作成する

まずは、テンプレートを新規作成します。

ファイル:myapptdl>tdl>templates>tdl>tdl_execution.html

コード:

{% extends './base.html' %}
{% block content %}
     <h1>くじ引き結果</h1>

    <table class='table table-striped table-hover'>
        <tr>
            <th>内容</th>
        </tr>
        {% for tdl in object_list%}
        <tr>
            <td> {{ tdl.item }}</td>
        </tr>
        {% endfor %}
    </table>

    <div>
      <a href='JavaScript:history.back()'>戻る</a>
    </div>

{% endblock %}

実行ページでは、データベースから取り出した内容を表示しているだけです。

4.tdl_list.htmlを修正する

最後に一覧画面に実行ボタンを作成します。

ファイル:myapptdl>tdl>templates>tdl>tdl_list.html

コード:

{% extends './base.html' %}
{% block content %}
       <h1>くじ引き内容</h1>

<table class='table table-striped table-hover'>
    <tr>
        <th>内容</th><th>編集</th><th>削除</th>
    </tr>
    {% for tdl in object_list%}
    <tr>
        <td> {{ tdl.item }}</td>
        <td> <a href='{% url "tdl:update" tdl.id %}'>編集</a> </td>
        <td> <a href='{% url "tdl:delete" tdl.id %}'>削除</a> </td>
    </tr>
    {% endfor %}
</table>

    <div>
        <a href='{% url "tdl:create" %}' class="btn btn-primary">新規作成</a> #修正
        <a href='{% url "tdl:execution" %}' class="btn btn-secondary">実行</a> #追加
    </div>
{% endblock %}

新規作成リンクだとちょっと寂しいので、ボタンに変更します。
その下に、実行ボタンを作成します。

以上で設定は終わりなので、サーバを起動して確認します。

cd myapp 
python manage.py runserver

次のURLにブラウザでアクセスします。

http://localhost:8000/

一覧表示画面を確認すると、新規作成ボタンの右側に実行ボタンが表示されています。

実行ボタンを押してみると、一つだけデータが表示されます。

今回は動画を作成しましたのでそちらをご覧ください。

以上で今回の目的である削除画面を作成することができました。

本日はここまでです。

ありがとうございました。

【参考にしたサイトと本】

Djangoで複数のモデルオブジェクトをランダムに取得する方法 - Qiita
開発環境Python 3.7.3Django 3.0.5※Class-Basedで開発していきます。一番簡単な書き方from django.views.generic import Lis…

Python Django3超入門 (日本語) 単行本 – 2020/6/13

コメント

タイトルとURLをコピーしました