ビューは、ルーティングからの情報を受け取ってレスポンスの情報を作ります。

ビュー

ビューはアプリケーションの司令塔となり、フォーム、モデル、テンプレートとやりとりをします。

ビューの機能

  • フォームに処理を依頼
  • モデルにデータベースの操作を依頼
  • テンプレートに HTML の生成を依頼
  • 画面遷移先の判断

ビューの種類

ビューの種類は、クラスベース汎用ビューと関数ベースビューがあります。

シンプルな処理の場合

  • クラスベース汎用ビューを使用

複雑な処理の場合

  • 関数ベースビューを使用

クラスベース汎用ビューとは?

クラスベース汎用ビューは、すでにビューとしての機能を備えていて、クラスを継承します。

公式ドキュメント

これを使用すると、記述する量が減り、簡単なプログラムで View を作成することができます。

このチュートリアルでは、主にクラスベース汎用ビューを使用していきます。

クラスベース汎用ビューの種類

django.views.generic に、それぞれのビューが準備されているので、import して継承します。

クラスベース汎用ビュー 説明
View シンプルな汎用ビュー
TemplateView テンプレートを使用して、何かを表示する汎用ビュー
ListView 一覧を表示する汎用ビュー
DetailView 詳細ページを表示する汎用ビュー
CreateView 新しくデータを追加するフォームを提供する汎用ビュー
UpdateView データを更新するフォームを提供する汎用ビュー
DeleteView データを削除する汎用ビュー
RedirectView リダイレクトに特化した汎用ビュー
FormView フォーム処理をする汎用ビュー

このチュートリアルでは主にViewを継承してビューを作成します。

Viewを継承する理由は、処理の内容を把握しやすいからです。

設定した変数を使用

設定した変数を使用したい場合には、汎用ビューで定義されている関数をオーバーライドします。

get_context_data 関数を使用すると、使用したい変数に変えることができます。

普段はデフォルト値を使用して、変更したい時だけ値をオーバーライドします。

独自のテンプレートの名前を使用したい場合は、template_name をオーバーライドします。

オーバーライドするクラス変数

クラス変数 説明
template_name テンプレート名を指定する
model モデルを指定する
paginate_by 1 ページに表示する件数を指定する
queryset テンプレートにクエリセットを渡す
form_class フォームクラス名を指定する
success_url 処理成功時にリダイレクト URL を指定する
fields ビューで使うフォームのフィールドを指定する

オーバーライドするメソッド

メソッド 説明
get_context_data テンプレートに辞書データを渡す
get_queryset テンプレートにクエリセットを渡す
form_valid フォームのバリデーションに問題がない場合の処理
form_invalid フォームのバリデーションに問題があった場合の処理
get_success_url 処理成功時のリダイレクト URL を指定
delete 削除処理時の処理を追加
get 独自の GET 通信時の処理を記述
post 独自の POS 通信時の処理を記述

関数ベースビュー

関数ベースビューは、レスポンスを返す return 処理まで記述する必要があります。

必ず何を表示させるかの return が必要になり、ない場合はエラーになります。

関数ベースビューは、request オブジェクトを引数で受け取ります。

request オブジェクトから、リクエスト情報を取得することができます。

View を作成

トップページのビューを作成します。

app/views.py

from django.views.generic import View
from django.shortcuts import render
from .models import Post


class IndexView(View):
    def get(self, request, *args, **kwargs):
        post_data = Post.objects.order_by("-id")
        return render(request, 'app/index.html', {
            'post_data': post_data,
        })

コード解説

Viewを継承して、クラスベース汎用ビューを作成します。

class IndexView(View):

get 関数は、画面が表示されたら必ず最初に呼ばれます。

def get(self, request, *args, **kwargs):

Post モデルを呼び出し、降順に並び変えています。

post_data = Post.objects.order_by("-id")

render 関数を使用して、テンプレートにデータを渡します。

return render(request, 'app/index.html', {
    'post_data': post_data,
})