(最終更新月:2022年7月)
✔このような方へ向けて書かれた記事となります
「DjangoでCreateViewの実装方法が知りたい」
「CreateViewとFormViewの違いは?」
「CreateViewの実例を教えてほしい」
✔当記事を通じてお伝えすること
- CreateViewとは?FormViewと何が違うのか
- DjangoのCreateViewの実装方法
- 実例コードを公開
当記事を最後までご覧いただければ、CreateViewの実装方法がわかるのはもちろん、作成予定のアプリに応用するためのコード実例も手に入ります。
CreateViewとは?FormViewとの違いは?
こちらではCreateViewとは何かをご説明します。
CreateViewの実装方法が知りたい方は次章へお進みください。
CreateViewとは?
CreateViewとはクラスベースビューのひとつで、データの登録や作成をするときに使われるものです。
SNS「Twitter」を例にすると、CreateViewが使えるケースは以下のとおり。
- ユーザーの登録
- ツイートの投稿
- DMの送信
CreateViewを使うことで、短いコードでデータ保存画面の作成ができるようになります。
FormViewとの違いは?
データの登録や作成では、FormViewというクラスベースビューを使うこともできます。
何が違うのでしょうか?
以下にそれぞれの特徴をまとめましたのでご覧ください。
項目 | CreateView | FormView |
---|---|---|
目的 | フォームデータの保存 | フォームの表示と入力値の処理 |
使用するフォームクラス | 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で使えるメソッドを解説
メソッドを使うことで、より柔軟なアプリケーションの作成ができるようになります。
こちらでご紹介するメソッドは以下のとおり。
- get_success_url
- get_context_data
- get_form_kwargs
- 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に備わっているクラスベースビューの中でも、非常に使われる頻度が高いビュークラスです。
一度覚えればとても簡単に実装できるのでぜひマスターしてしまいましょう。