PR

【Django】ビュー(views.py):初心者向けに5ステップで解説

Django

Djangoにおけるビュー(views.py)は、ユーザーからのリクエストを受け取り、それに基づいたレスポンスを生成するコンポーネントです。言い換えると、ユーザーとアプリケーションの間のインターフェースの役割を果たすのがビューです。

この記事では、Djangoのビュー(views.py)について、初心者でも理解できるように詳しく解説します。

具体的には、ビューの基本的な作成方法から、より高度なリストビューフォームビューの活用方法までを、5つのステップに分けて学んでいきます。

このページで学べる内容
  • ステップ1:ビューとは
  • ステップ2:関数ベースビューの作成
  • ステップ3:クラスベースビューの作成
  • ステップ4:汎用ビューの活用
    • リストビュー
    • ディテールビュー
    • フォームビュー
  • ステップ5:ビューのテスト方法

Pythonエンジニア/Djangoを利用したWeb開発者を目指す方であれば知らないと恥ずかしい超・基本知識の1つ。是非最後までご覧ください。

スポンサーリンク

Djangoのビュー(view)とは?

Djangoにおけるビューは、ユーザーからのリクエストを受け取り、それに基づいたレスポンスを生成するコンポーネントです。つまり、ユーザーとアプリケーションの間のインターフェースの役割を果たします。

ビューはDjangoアプリケーションの中心的な部分であり、その動作を理解することは、Djangoでの開発スキルを向上させるために重要です。

ビューは基本的にPythonの関数またはクラスとして定義されます。その役割はユーザーからのHTTPリクエストを受け取り、HTTPレスポンスを返すことです。

Djangoのビュー
図1:Djangoのビュー

参考 HTTPリクエスト/HTTPレスポンスとは?

このレスポンスは通常、HTML形式のWebページですが、JSON形式のデータや、リダイレクト、404エラーなど、他の任意の形式のレスポンスも可能です。

ビューはviews.pyという名前のPythonファイルに定義されます。このファイルはDjangoアプリケーションを作成した際に自動的にディレクトリ内に保存されます。

Django view.py
図2:Django view.py

ビューの基本的な作成方法は2つ。1つは関数ベースのビュー、もう1つはクラスベースのビューです。

以下に、関数ベースのビューとクラスベースのビューの特徴と違いを表形式で整理しました。

関数ベースビュークラスベースビュー
定義方法Pythonの関数として定義Pythonのクラスとして定義
適用範囲小規模なアプリケーションや単純なビュー大規模なアプリケーションや複雑なビュー
特徴シンプルで直感的な構造再利用性と拡張性が高い
メソッドHTTPメソッド(GET, POSTなど)ごとに条件分岐が必要HTTPメソッドごとに異なるメソッド(get(), post()など)を定義できる
ミックスイン使用不可使用可能(複数のビヘイビアを組み合わせることが可能)
def hello_world(request): return HttpResponse("Hello, World!")class HelloWorldView(TemplateView): template_name = "hello_world.html"

関数ベースのビューはそのシンプルさから理解しやすく、小規模なアプリケーションや単純なビューの作成に適しています。一方、クラスベースのビューは再利用性と拡張性が高く、大規模なアプリケーションや複雑なビューの作成に適しているのが特徴。

それぞれの作成方法について次の章で解説していきます。Djangoのビューについてさらに深掘りしていきましょう。

関数ベースビューの作成

関数ベースのビューは、Pythonの関数として定義され、1つのHTTPリクエストに対して1つのHTTPレスポンスを返します。

この関数は、リクエストを引数として受け取り、レスポンスを戻り値として返します。

早速、具体的なコードを見てみましょう。以下は、最も基本的な関数ベースのビューの例です。

from django.http import HttpResponse

def hello_world(request):
    return HttpResponse("Hello, World!")

参考 import文 / def文

このコードは、hello_worldという名前のビューを定義。このビューは、HTTPリクエストを受け取り、"Hello, World!"というテキストを含むHTTPレスポンスを返します。

関数ベースのビューは、そのシンプルさから、小規模なアプリケーションや単純なビューの作成に適しています。しかし、大規模なアプリケーションや複雑なビューを作成する場合には、クラスベースのビューを使用することが推奨されます。

先ほどのビューをDjangoアプリケーションで使用するには、URLconf(URL設定)にこのビューを追加する必要があります。

URLconfは、URLとビューをマッピングするための設定で、urls.pyという名前のPythonファイルに定義されます。以下は、先ほど定義したhello_worldビューをURLconfに追加する例です。

from django.urls import path
from .views import hello_world

urlpatterns = [
    path('hello/', hello_world),
]

例えば、あなたがローカル環境でDjangoアプリケーションを実行しているとします。通常、ローカル環境でDjangoアプリケーションを実行すると、http://127.0.0.1:8000/またはhttp://localhost:8000/というURLでアクセスできます。

このとき、hello_worldビューを/hello/というURLにマッピングした場合、http://127.0.0.1:8000/hello/またはhttp://localhost:8000/hello/というURLにアクセスすると、"Hello, World!"というテキストが表示されます。

クラスベースビューの作成

関数ベースのビューがシンプルで直感的な一方で、クラスベースのビューはその再利用性と拡張性から、より大規模なアプリケーションや複雑なビューの作成に適しています。

クラスベースのビューはPythonのクラスとして定義され、Djangoが提供するビューの親クラスを継承して作成します。

早速、こちらも具体的なコードを見てみましょう。以下は、最も基本的なクラスベースのビューの例です。

from django.views.generic import TemplateView

class HelloWorldView(TemplateView):
    template_name = "hello_world.html"

参考 class文 / 変数の基本

このコードは、HelloWorldViewという名前のビューを定義。このビューは、TemplateViewというDjangoが提供するビューの親クラスを継承しており、hello_world.htmlというテンプレートを使用してHTTPレスポンスを生成します。

このビューをDjangoアプリケーションで使用するには、関数ベースのビューと同様に、URLconfにこのビューを追加する必要があります。

ただし、クラスベースのビューをURLconfに追加するときには、ビューのクラス名にas_view()メソッドを追加する必要があります。以下は、先ほど定義したHelloWorldViewビューをURLconfに追加する例です。

from django.urls import path
from .views import HelloWorldView

urlpatterns = [
    path('hello/', HelloWorldView.as_view()),
]

このコードは、/hello/というURLがリクエストされたときに、HelloWorldViewビューが呼び出されるように設定しています。つまり、ユーザーがhttp://127.0.0.1:8000/hello/またはhttp://localhost:8000/hello/というURLにアクセスすると、hello_world.htmlというテンプレートが表示されます。

関数ベースビュークラスベースビュー
定義方法Pythonの関数として定義Pythonのクラスとして定義
適用範囲小規模なアプリケーションや単純なビュー大規模なアプリケーションや複雑なビュー
特徴シンプルで直感的な構造再利用性と拡張性が高い
メソッドHTTPメソッド(GET, POSTなど)ごとに条件分岐が必要HTTPメソッドごとに異なるメソッド(get(), post()など)を定義できる
ミックスイン使用不可使用可能(複数のビヘイビアを組み合わせることが可能)
def hello_world(request): return HttpResponse("Hello, World!")class HelloWorldView(TemplateView): template_name = "hello_world.html"

以上が、クラスベースのビューの基本的な作成方法とその使用方法です。次の章では、クラスベースのビューをさらに拡張する方法について解説します。

クラスベースビューの拡張(汎用ビューの活用)

クラスベースのビューは、その再利用性と拡張性から、より大規模なアプリケーションや複雑なビューの作成に適しています。

Djangoの汎用ビュー(Generic Views)は、一般的なWeb開発タスクを簡単に行うための、多くの組み込みビューを提供しています。これらのビューは、クラスベースのビューを拡張して作成されています。汎用ビューを使用すると、特定のタスクを実行するためのコードを大幅に減らすことができます。

たとえば、Djangoには、データベースからオブジェクトを取得して表示するためのListView、新しいオブジェクトを作成するためのCreateView、既存のオブジェクトを更新するためのUpdateView、オブジェクトを削除するためのDeleteViewなど、多くの汎用ビューがあります。

Django:ListView

ListViewは、あるモデルのオブジェクトのリストを表示するためのビューです。デフォルトでは、これは全てのオブジェクトを取得しますが、get_querysetメソッドをオーバーライドすることでカスタマイズできます。

from django.views.generic import ListView
from .models import Book

class BookListView(ListView):
    model = Book
    template_name = 'books/book_list.html'  # <app>/<model>_<viewtype>.html

このビューは、Bookモデルの全インスタンスをリストで表示するビューです。template_nameで指定されたテンプレートを用いて表示します。ここでは books/book_list.html と指定しています。

参考 Djangoのモデル

Django:DetailView

DetailViewは、単一のオブジェクトの詳細を表示するためのビューです。

from django.views.generic import DetailView
from .models import Book

class BookDetailView(DetailView):
    model = Book
    template_name = 'books/book_detail.html'  # <app>/<model>_<viewtype>.html

このビューは、Bookモデルの単一のインスタンス(=レコード)の詳細を表示するビューです。具体的なインスタンスはURLから取得されます(一般的にはプライマリキー)。

Django:CreateView

CreateViewは、新たなオブジェクトを作成するためのビューです。

from django.views.generic.edit import CreateView
from .models import Book

class BookCreateView(CreateView):
    model = Book
    fields = ['name', 'author', 'price']  # ここにモデルのフィールドを記述
    template_name = 'books/book_form.html'  # <app>/<model>_<viewtype>.html

このビューは、新しいBookインスタンスを作成するためのフォームを表示し、そのフォームの送信を処理するビューです。ここでfieldsフォームに表示するフィールドを指定します。

Django:UpdateView

UpdateViewは、既存のオブジェクトを更新するためのビューです。

from django.views.generic.edit import UpdateView
from .models import Book

class BookUpdateView(UpdateView):
    model = Book
    fields = ['name', 'author', 'price']
    template_name = 'books/book_form.html'  # <app>/<model>_<viewtype>.html

このビューは、既存のBookインスタンスを更新するためのフォームを表示し、そのフォームの送信を処理します。編集するインスタンスはURLから取得されます。

Django:DeleteView

DeleteViewは、既存のオブジェクトを削除するためのビューです。

from django.views.generic.edit import DeleteView
from .models import Book

class BookDeleteView(DeleteView):
    model = Book
    template_name = 'books/book_confirm_delete.html'  # <app>/<model>_<viewtype>.html
    success_url = '/'  # 削除後にリダイレクトするURL

このビューは、既存のBookインスタンスを削除するための確認ページを表示し、その削除を処理します。削除するインスタンスはURLから取得されます。削除が成功した後はsuccess_urlで指定したURLにリダイレクトされます。

以上が、Djangoの汎用ビューの基本的な活用方法とその使用方法です。このように、汎用ビューを使用すると、一般的なWeb開発タスクを簡単に行うことができます。

ビューのテスト

最後に、作成したビューを簡単にテストする方法をご紹介します。

Djangoビューのテストは、アプリケーションの品質を確保するために重要なステップです。テストを行うことで、ビューが期待通りに動作することを確認し、エラーやバグを早期に発見することが可能に。

Djangoはビューのテストを支援するための強力なツールを提供しており、それはdjango.testモジュールのTestCaseクラスという形で用意されています。

我々はこのクラスをうまく使用することで、簡単にビューのテストを行うことができます。

以下に、ビューのテストの基本的な手順を示します。

ステップ1:テストケースの作成

まず、django.test.TestCaseを継承したクラスを作成します。このクラス内にテストメソッドを定義します。

from django.test import TestCase

class MyViewTest(TestCase):
    ...

ステップ2:テストメソッドの定義

次に、テストケースクラス内にテストメソッドを定義します。テストメソッドの名前はtest_で始まる必要があります。

def test_my_view(self):
    ...

ステップ3:ビューのテスト

最後に、TestCaseクラスのclient属性を使用して、ビューにリクエストを送信し、レスポンスを検証します。

response = self.client.get('/my-view-url/')
self.assertEqual(response.status_code, 200)

このコードは、/my-view-url/にGETリクエストを送信し、レスポンスのステータスコードが200(成功)であることを確認しています。

以上が、Djangoのビューのテストの基本的な手順です。このように、Djangoのテストフレームワークを使用すると、ビューのテストを簡単に行うことができます。

Django:ビュー(views.py)のまとめ

  1. ビューの基本: Djangoのビューは、ユーザーからのリクエストを受け取り、レスポンスを生成する役割を果たします。ビューは関数またはクラスとして定義されます。
  2. 関数ベースビュー: 関数ベースビューは、シンプルで直感的なビューの作成方法です。一つの関数が一つのビューを表します。
  3. クラスベースビュー: クラスベースビューは、より複雑なビューの作成やコードの再利用を可能にします。ビューの振る舞いをカスタマイズするために、クラスの継承やミックスインを利用できます。
  4. 汎用ビュー: Djangoは、一般的なウェブ開発タスクを簡単に行うための汎用ビューを提供しています。これらは、リストビュー、ディティールビュー、フォームビューなど、特定の用途に最適化されたクラスベースビューです。
  5. ビューのテスト: Djangoのテストフレームワークを使用して、ビューの動作を確認するテストを作成できます。これにより、コードの品質を保証し、バグを早期に発見できます。

初めてPythonを勉強するのは結構難しいですよね。

でもその悩みを抱えているのは一人じゃありません。全てのPython使いが同じ道を進んできました。

Pythonをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?今すぐ行動したい方は以下の記事をチェック!

読者料典 Python入門:学習カリキュラム ←こちらから!

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
DjangoPython
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました