LoginSignup
13
10

More than 3 years have passed since last update.

Djangoの関数ベースビュー

Last updated at Posted at 2020-04-26

はじめに

ここでは、djangoの関数ベースビューの基本について解説していきます。
アプリケーションディレクトリ下のviews.pyに書いていきます。
モデルとしてmodels.pySampleModelを利用するものとします。

リストページ用のビュー関数

ブログの記事一覧ページなど、複数のレコードを一覧表示するページに使える関数です。

views.py
from django.shortcuts import render

from .models import SampleModel


def list_func(request):
    object_list = SampleModel.objects.all()
    context = {'object_list': object_list}
    return render(request, 'app/app_list.html', context)

object_listは、表示対象とするモデルに含まれる全てのレコードのリストです。
contextでは、テンプレートとなるHTMLファイルに変数を埋め込むときの変数名と、この関数内での変数名との対応関係を示す辞書です。
そして最後のrender関数に、テンプレートとなるHTMLファイルと、上で触れたcontextを明示します(第一引数はrequestになります)。

新規作成ページ用のビュー関数

ブログの新規記事の作成など、新しいレコードを作成するページに使える関数です。

views.py
from django.shortcuts import render, redirect

from .models import SampleModel


def create_func(request):
    if request.method == 'POST':
        object = SampleModel.objects.create(
                title = request.POST['title'],
                text = request.POST['text']
                )
        object.save()
        return redirect('app_list')
    else:
        return render(request, 'app/app_create.html')

まず、if request.method == 'POST'のところで、POST送信されたときの処理を記述しています。
Model.objects.createメソッドで、POST送信されたrequest内容に従って新しいレコード(ここではobject)を作成し、save()メソッドでデータベースに登録します。
データベースへの書き込みに成功したら、redirect()で指定したページへ遷移します。
POSTではなくGETでページが呼び出された場合(普通にURLを打ち込んでアクセスされた場合など)は、render()で指定したテンプレートHTMLファイルが呼び出されます。

詳細ページ用のビュー関数

ブログの記事の個別ページなど、レコードの詳細を表示するページに使える関数です。

views.py
from django.shortcuts import render

from .models import SampleModel


def detail_func(request, pk):
    object = SampleModel.objects.get(pk=pk)
    context = {'object': object}
    return render(request, 'app/detail.html', context)

objectは、モデルに登録されているレコードから、該当するレコードを抽出してきたものになります(pkはprimary key)。
objectに関連する情報を、テンプレートHTMLファイルの変数に埋め込んで表示します。

編集ページ用のビュー関数

ブログの記事の編集画面など、一度作成したレコード内容を更新するページに使える関数です。

views.py
from django.shortcuts import render, redirect

from .models import SampleModel


def update_func(request, pk):
    object = SampleModel.objects.get(pk=pk)
    context = {'object': object}
    if request.method == 'POST':
        object.title = request.POST['title']
        object.text = request.POST['text']
        object.save()
    else:
        return render(request, 'app/app_update.html', context)

上で紹介したビューと同様に、objectで対象レコードを指定し、contextでHTMLテンプレートファイルに埋め込む変数名を明示します。
更新内容がPOST送信されたときは、各フィールドの内容をデータベースに上書きします。

削除ページ用のビュー関数

ブログの記事の削除画面など、作成したレコードを削除するページに使える関数です。

views.py
from django.shortcuts import render, redirect

from .models import SampleModel


def delete_func(request, pk):
    object = SampleModel.objects.filter(pk=pk)
    context = {'object': object}
    if request.method == 'POST':
        object.delete()
        return redirect('app:app_list')
    else:
        return render(request, 'app/app_delete.html', context)

objectcontextは、上で紹介したビューと同様です。
deleteメソッドで、データベースからレコードを消去します。

まとめ

ここでは、djangoの関数ベースビューの基本について紹介しました。
次回は、urls.pyについて解説する予定です。

13
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10