contextでクラスビューからデータベースの値をテンプレートへ渡す【Django】

contextでクラスビューからデータベースの値をテンプレートへ渡す【Django】
えびかずき
えびかずき

こんにちは、えびかずきです。

今回は、contextでクラスビューからデータベースの値をテンプレートへ渡す方法について説明します。

こんな人におすすめ:
・contextを使う場合の変数の割り当て方法を知りたい。
・既にモデルを割り当てたクラスビューにデータベース由来の値を追加したい。

開発環境

OS:MacOS Catalina 10.15
IDE:PyCharm 
Python:3.7.3
Django:2.2.2
PostgreSQL:10.3

作業の概要

今回の作業の大まかな流れは下図の通りです。

データベースの値をDjangoフレームワークのモデルを経由してビューへ繋ぎ、それをテンプレートへ渡すという流れになります。

データベースの値をテンプレートへ渡す流れ

今回は具体例として、ボタンをクリックすると値が1ずつ増えていく『いいねボタン』の実装をしてみます。

では具体的にコーディングを進めていきましょう。

モデルを定義する

まずはデータベースを反映したモデルを定義します。

#models.py

from django.db import models

class Good(models.Model):

    good = models.IntegerField(verbose_name='いいね', blank=True, null=True)

    class Meta:
        verbose_name_plural = 'Good'

Djangoの『models.Model』を親クラスとして継承して、『Good』というモデルクラスを新しく定義しています。

そしてさらにその中身のフィールドとして、IntegerFieldを継承した『good』フィールドを定義しています。

この『good』フィールドがいいねの数をカウントするレコードを反映することになります。

※モデルの編集が終わったら、migrateを実行してデータベースとモデルをつなぐ必要があります。

ビューへモデルを渡す

続いて、ビューへ定義したモデルを渡します。

下のコードは、
既にモデルを指定済みのListViewクラスへモデルを渡す場合の例です。

#views.py

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views import generic
from .models import Diary,Good

class DiaryListView(LoginRequiredMixin, generic.ListView):
    model = Diary
    template_name = 'diary_list.html'

   # メソッドをオーバーライドする形で、contextへgoodフィールドを渡す。
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        good_object = Good.objects.get(id=1)
        context['Good'] = good_object.good
        return context
       
        ・
        ・
        ・

ここでは『diary_list.html』というテンプレートを管理するクラスビューへモデルのフィールドを渡しています。

いいねボタンの動作を実装する

次に、いいねボタンが押された時の動作を実装しておきます。

#views.pyへいいね動作を追記

from django.shortcuts import redirect

#いいねボタンをクリックした時の動作
def good(request): 
    post = Good.objects.get(id=1)

    #postリクエストが来た時だけ発動させる
    if request.method == 'POST':
        # いいねをカウント
        post.good += 1
        post.save()

   #リダイレクトで下のページへ戻る 
  return redirect('diary:diary_list')

ルーティングを設定する

url.pyを編集して、ルーティングの設定を行います。

ここでは『いいねボタン』がクリックされた時の動作として、先ほど作ったgoodビュー関数をurlpatternsへ加えておきます。

from django.urls import path
from . import views


app_name = 'diary'
urlpatterns = [
    path('diary-list/', views.DiaryListView.as_view(), name="diary_list"),
    path('good/', views.good, name='good'),
]

テンプレートを編集する

最後にテンプレートの編集です。

  <form action="{% url 'diary:good' %}" method="post">
                            {% csrf_token %}
                            <input type="submit" name="good" value="いいね" id="good">{{ Good }} good!
                        </form>

ここではformでいいねボタンを定義して、クリックされるとdairyアプリケーションのgoodルーティングで指定したビュー関数を呼び出すようにコーディングしています。

そしてボタン横のスペースに{{ Good }}(ここはビューのcontext辞書の名前を記述する)と記述することで、いいねをカウントしているデータベースの値を表示しています。

これで全ての作業が完了しました!

まとめ

今回はcontextを使ってクラスビューからデータベースの値をテンプレートへ送る方法について説明しました。

長らく寄り道をしていましたが、やっとDjangoネタに戻ってきました。

今作っているWebアプリの完成に向けて、Django開発をどんどん進めていこうと思います。

今回は以上!

Djangoカテゴリの最新記事