Djangoにおけるビュー(views.py)は、ユーザーからのリクエストを受け取り、それに基づいたレスポンスを生成するコンポーネントです。言い換えると、ユーザーとアプリケーションの間のインターフェースの役割を果たすのがビューです。
この記事では、Djangoのビュー(views.py)について、初心者でも理解できるように詳しく解説します。
具体的には、ビューの基本的な作成方法から、より高度なリストビューやフォームビューの活用方法までを、5つのステップに分けて学んでいきます。
Pythonエンジニア/Djangoを利用したWeb開発者を目指す方であれば知らないと恥ずかしい超・基本知識の1つ。是非最後までご覧ください。
Djangoのビュー(view)とは?
Djangoにおけるビューは、ユーザーからのリクエストを受け取り、それに基づいたレスポンスを生成するコンポーネントです。つまり、ユーザーとアプリケーションの間のインターフェースの役割を果たします。
ビューはDjangoアプリケーションの中心的な部分であり、その動作を理解することは、Djangoでの開発スキルを向上させるために重要です。
ビューは基本的にPythonの関数またはクラスとして定義されます。その役割はユーザーからのHTTPリクエストを受け取り、HTTPレスポンスを返すことです。
このレスポンスは通常、HTML形式のWebページですが、JSON形式のデータや、リダイレクト、404エラーなど、他の任意の形式のレスポンスも可能です。
ビューはviews.py
という名前のPythonファイルに定義されます。このファイルはDjangoアプリケーションを作成した際に自動的にディレクトリ内に保存されます。
ビューの基本的な作成方法は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!")
このコードは、hello_world
という名前のビューを定義。このビューは、HTTPリクエストを受け取り、"Hello, World!"というテキストを含むHTTPレスポンスを返します。
関数ベースのビューは、そのシンプルさから、小規模なアプリケーションや単純なビューの作成に適しています。しかし、大規模なアプリケーションや複雑なビューを作成する場合には、クラスベースのビューを使用することが推奨されます。
クラスベースビューの作成
関数ベースのビューがシンプルで直感的な一方で、クラスベースのビューはその再利用性と拡張性から、より大規模なアプリケーションや複雑なビューの作成に適しています。
クラスベースのビューはPythonのクラスとして定義され、Djangoが提供するビューの親クラスを継承して作成します。
早速、こちらも具体的なコードを見てみましょう。以下は、最も基本的なクラスベースのビューの例です。
from django.views.generic import TemplateView class HelloWorldView(TemplateView): template_name = "hello_world.html"
このコードは、HelloWorldView
という名前のビューを定義。このビューは、TemplateView
というDjangoが提供するビューの親クラスを継承しており、hello_world.html
というテンプレートを使用してHTTPレスポンスを生成します。
関数ベースビュー | クラスベースビュー | |
---|---|---|
定義方法 | 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)のまとめ
初めてPythonを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのPython使いが同じ道を進んできました。
Pythonをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?今すぐ行動したい方は以下の記事をチェック!
読者料典 Python入門:学習カリキュラム ←こちらから!