本文へスキップ
BecomeCoder

Djangoコース · 第7章 公開と次の一歩 · レッスン32

次に学ぶこと ― クラスベースビューと DRF

ローカル実施

導入

おめでとうございます。URL・ビュー・テンプレート・フォーム・モデルまで、Django で Web サイトを作る土台が身につきました。最後に、次のステップとして知っておくと世界が広がる2つのトピックを紹介します。

説明

クラスベースビュー(CBV)

これまで書いてきたのは「関数」のビュー(FBV: Function-Based View)でした。Django には、よくあるパターン(一覧・詳細・作成・更新・削除)をクラスで短く書く仕組みもあります。

# 関数ビュー(これまでのやり方)
def post_list(request):
    posts = Post.objects.all()
    return render(request, "blog/post_list.html", {"posts": posts})

# クラスベースビュー(同じことを数行で)
from django.views.generic import ListView, DetailView

class PostList(ListView):
    model = Post                        # これだけで一覧ページが完成
    # テンプレート名・変数名も規約で自動決定される

class PostDetail(DetailView):
    model = Post                        # /posts/<pk>/ の詳細ページ

ListView / DetailView / CreateView / UpdateView / DeleteView といった「汎用ビュー」を使うと、定型的な CRUD 画面をほとんどコードなしで作れます。仕組みを理解するには関数ビューが分かりやすいので、まず本コースの関数ビューで基礎を固め、慣れてきたら CBV で短く書く、という順番がおすすめです。

② Django REST Framework(DRF)― APIを作る

スマホアプリや React・Vue などのフロントエンドと通信するには、HTML ではなく JSON を返す API が必要です。第2章で JsonResponse を使いましたが、本格的な API には Django REST Framework(DRF) という定番ライブラリを使います。

# pip install djangorestframework
from rest_framework import serializers, viewsets

# モデル → JSON の変換ルール
class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ["id", "title", "body"]

# 一覧・詳細・作成・更新・削除のAPIを一気に用意
class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

これだけで GET /api/posts/(一覧)、POST /api/posts/(作成)、GET /api/posts/1/(詳細)……といった REST API が完成します。認証・ページネーション・入力検証も DRF が面倒を見てくれます。

学びの地図

flowchart TD
  B["本コース<br/>URL・ビュー・テンプレート・フォーム・モデル"] --> C["クラスベースビュー<br/>CRUDを短く書く"]
  B --> D["Django REST Framework<br/>JSON API を作る"]
  B --> E["認証の応用<br/>ソーシャルログイン・権限"]
  C --> F["実戦:<br/>自分のアプリを作って公開"]
  D --> F
  E --> F

次におすすめの一歩は、自分の作りたいものを1つ、小さく作って公開してみることです。ToDo アプリ、メモ帳、日記、ブックマーク集 ―― 何でも構いません。本コースで学んだ部品の組み合わせで、驚くほど多くのものが作れます。詰まったら、公式ドキュメント(Django Documentation)と、公式チュートリアル「はじめての Django アプリ作成」が最良の相棒です。

Web 開発の旅を楽しんでください!