こんにちは、えびかずきです。
今回は、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開発をどんどん進めていこうと思います。
今回は以上!
コメントを書く