関数ベースのView

関数ベースのVIew

DjangoのバックエンドであるViewは驚くほど簡単に書くことができます。
DjangoのViewには関数ベース(def)とクラスベース(class)の2種類存在しています。

基本的には全てのViewをクラスベースで書くべきだと思いますが、
関数ベースは作成するのがとても簡単です。

views.py

from django.shortcuts import render

def index(request):
    context = {
        'sample_data': 'Hello world!'
    }
    return render(request, 'index.html', context)

これでsample_viewの作成が完了しました。

urls.py


from django.urls import path
from . import views

app_name= sample_app
urlpatterns = [
    path('', views.index, name="index"),
]

上記のようにsample_viewをurls.pyにルーティング登録したら、htmlファイルで contextデータを受け取ることができます。

templates/index.html


{{ sample_data }}

これでページに
Hello world!
と表示されます。

リクエストを分ける

関数ベースでViewを作成する場合、GETリクエストとPOSTリクエストを分けるのが良いとされています。
ここで分けるときは、純粋にIf文で分岐をかけます。

views.py

from django.shortcuts import render, redirect

from .models import Article

def index(request):

    if request.method == 'POST':
        # POSTの処理を書く
        url = request.META['HTTP_REFERER'] #リクエスト元のURLを取得
        return redirect(url)   

    # GETの処理
    articles = Article.objects.all()
    context = {
        articles: articles'
    }
    return render(request, 'index.html', context)

これによって、POSTリクエストが送られてきた際、自動でリクエスト元のページにリダイレクトし、GETリクエストの場合は、models.pyで作成したArticleのデータのクエリセット を返すViewが完成しました。

Viewの作成に向けて

これで少し気づいたかもしれませんが、Viewを関数ベースで作り込んでいくと、コードが段々と冗長に長くなってきます。
本来であれば、POSTリクエストの処理とGETリクエストの処理を分ける方が良いですし、
プログラムは、関数に分けて管理した方が楽です。

コードの運用面においてもクラスベースで実装を進めた方が良いので、次章からクラスベースのViewの書き方を見ていきましょう。

処理が一つだけの場合、関数ベースの方が楽な場合もあります。
ケースバイケースに書き分けていけると良いでしょう。