【実例紹介】Django CreateViewの基本・使い方

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2022年7月)

✔このような方へ向けて書かれた記事となります

「DjangoでCreateViewの実装方法が知りたい」

「CreateViewとFormViewの違いは?」

「CreateViewの実例を教えてほしい」

✔当記事を通じてお伝えすること

  • CreateViewとは?FormViewと何が違うのか
  • DjangoのCreateViewの実装方法
  • 実例コードを公開

当記事を最後までご覧いただければ、CreateViewの実装方法がわかるのはもちろん、作成予定のアプリに応用するためのコード実例も手に入ります。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

CreateViewとは?FormViewとの違いは?

こちらではCreateViewとは何かをご説明します。

CreateViewの実装方法が知りたい方は次章へお進みください。

CreateViewとは?

CreateViewとはクラスベースビューのひとつで、データの登録や作成をするときに使われるものです。

SNS「Twitter」を例にすると、CreateViewが使えるケースは以下のとおり。

  • ユーザーの登録
  • ツイートの投稿
  • DMの送信

CreateViewを使うことで、短いコードでデータ保存画面の作成ができるようになります。

FormViewとの違いは?

データの登録や作成では、FormViewというクラスベースビューを使うこともできます。

何が違うのでしょうか?

以下にそれぞれの特徴をまとめましたのでご覧ください。

項目CreateViewFormView
目的フォームデータの保存フォームの表示と入力値の処理
使用するフォームクラスModelFormクラスFormクラス
ModelFormクラス
データ保存のための記述不要form_validメソッド内で要記述

FormViewはデータ保存に限らず、フォームに入力されたデータを自由に処理できるので自由度が高いです。

ただしデータ保存に関していえば、CreateViewよりも多くの記述が必要になります。

もしフォーム作成の目的がデータの保存なら、CreateViewを使うのがミスも少なく便利といえるでしょう。

CreateViewの実装手順

CreateViewを実装するためには以下のファイルに必要な記述をしていく必要があります。

  • models.py
  • forms.py
  • views.py
  • urls.py
  • テンプレート

それぞれのコードをご紹介します。

models.py:CreateViewには紐付けるモデルが不可欠

CreateViewでは、どのモデルクラスにデータを保存するのかを特定する必要があります。

なぜなら特定することで、より短いコードでデータ保存が実装できるからです。

モデルクラスを実装するためのmodels.pyを以下のとおりの記述としました。

class NippoModel(models.Model):
    title = models.CharField(max_length=100, verbose_name="タイトル")
    content = models.TextField(max_length=1000, verbose_name="内容")
    public = models.BooleanField(default=False, verbose_name="公開する")

こちらは当ブログで作成している日報アプリのモデルクラスです。

それでは、いよいよCreateViewを実装していきましょう。

forms.py:モデルフォームクラスの定義

forms.pyでは、ModelFormを使ってフォームクラスを定義します。

コード例は以下のとおり。

from django import forms
from .models import NippoModel

class NippoModelForm(forms.ModelForm):
    class Meta:
        model = NippoModel
        fields = "__all__"

モデルフォームでは、Metaクラス内に①紐付けるモデル②使用するフィールドを指定すれば完了です。

モデルフォームについて詳しくご覧になりたい方は、こちらの記事をご覧ください。

views.py:form_validが不要でシンプルな構造

views.pyでは、CreateViewを継承したビュークラスで、HTMLテンプレートとフォームクラスを紐付けます。

from django.views.generic.edit import CreateView

class NippoCreateFormView(CreateView):
    template_name = "nippo/nippo-formclass.html"
    form_class = NippoModelForm
    success_url = "/"

FormViewとは違い、form_validメソッドで保存のための関数定義は不要です。

定義すべき属性は以下の3つだけ。

  • template_name:テンプレート場所を指定
  • form_class:forms.pyで定義したフォームクラスを指定
  • success_url:データ保存後の行き先を指定

urls.py:ビュークラスとURLを紐付ける

urls.pyでは、作成したビュークラスにURLを紐付けます。

from django.urls import path
from .views import NippoCreateView

urlpatterns = [
    path("create/", NippoCreateView.as_view(), name="nippo-create"),
]

nippo-form.html:テンプレートファイル

テンプレートファイルでは、ビュークラスから渡された「form」変数を受け取り、画面に表示します。

{% extends 'base.html' %}

{% block content %}
<div class="container my-3" style="max-width:700px;">
    <div class="text-center my-3">
        <h2>新しく日報を作成</h2>
    </div>
    
    <form method="POST"> {% csrf_token %}
        {{ form.as_p }}
        <button class="btn btn-primary form-control" type="submit">登録</button>
    </form>
</div>
{% endblock %}

ポイントとしては、以下に注意しましょう。

  • POSTメソッドのフォームにすること
  • {% csrf_token %}タグを忘れないこと

以上で実装は完了です。

ただしこれも基本中の基本を説明したまで。

以下では応用するためのメソッドをご紹介していきます。

CreateViewで使えるメソッドを解説

メソッドを使うことで、より柔軟なアプリケーションの作成ができるようになります。

こちらでご紹介するメソッドは以下のとおり。

  1. get_success_url
  2. get_context_data
  3. get_form_kwargs
  4. form_valid

それぞれ見ていきましょう。

get_success_url

get_success_urlメソッドは、success_urlの関数バージョンです。

使いみちとしては、動的に行き先を決めたい場合などに使えます

例えば、ユーザーがログインしているかどうかで行き先を変えてみましょう。

def get_success_url(self):
    if self.request.user.is_authenticated:
        return "/"
    else:
        return "/login/"

もしユーザーがログインしていないのなら、保存後にログインページに飛ぶように促しています。

get_context_data

get_context_dataメソッドは、HTMLテンプレートに値を渡すために使えるメソッドです。

例えば好きな数字「100」を変数に格納して、テンプレートに渡してみましょう。

def get_context_data(self, *args, **kwargs):
    ctx = super().get_context_data(*args, **kwargs)
    ctx["your_favorite_number"] = 100
    return ctx

注意事項としては、必ず親クラス(super)から値を継承することだけ忘れないこと。

無事値が渡せたら、テンプレート内で以下のようにすれば値を受け取れます。

{{ your_favorite_number }}

get_form_kwargs

get_form_kwargsは、フォームクラスへ値を渡せるメソッドです。

より柔軟なコードを書く際には必須になりますので、ぜひ覚えておきましょう。

例えばログインユーザー情報をフォームで受け取るためには、以下のように記述します。

def get_form_kwargs(self, *args, **kwargs):
    kwgs = super().get_form_kwargs(*args, **kwargs)
    kwgs["user"] = self.requst.user
    return kwgs

詳しくはこちらの記事で説明してます。

form_valid

form_validは、フォームがエラーなく送信された際に発動するメソッドです。

主にデータを保存するときや送信されたデータを加工したいときに使います。

CreateViewでは使わなくとも保存されるため、例は割愛します。

詳しく実例をご覧になりたい方はこちらの記事をご覧ください。

まとめ:CreateViewを使えば短いコードでデータを保存が可能

当記事の内容をまとめると以下のとおりです。

  • CreateViewはFormViewと比べて、コードが短くデータ保存ができる
  • CreateViewでは、モデルクラスやモデルフォームとの紐づけが不可欠である
  • CreateViewは柔軟性にかけてしまうこともあるが、メソッドを使いこなせば問題なし

CreateViewは、Djangoに備わっているクラスベースビューの中でも、非常に使われる頻度が高いビュークラスです。

一度覚えればとても簡単に実装できるのでぜひマスターしてしまいましょう。

タイトルとURLをコピーしました