この記事ではDjangoにおけるクラスベースビュー、CreateView
について解説します。
それはなにか
CreateView
はモデルと連携して、データの新規保存を請け負います。
通常のウェブサイトでは、通常フォームを使用してユーザーからのデータを受け取ります。
CreateView
は受け取ったデータを精査して、モデルに設定されたフィールドに適したデータなのかを確認します。
いわゆるバリデーションです。
保存するのに支障が無ければ保存をモデルに依頼します。
そして、モデルがデータを保存します。
最後に、success_url
で示されたURLか、get_success_url
で返されたURLに移動します。
これが、CreateView
の動作です。
どんないいことがあるのか
- モデルにを定義した段階で、すでにバリデーションの条件を記載したことになりますので、いちいちバリデーション内容を記述する必要がありません。
fields
によって受け入れるフィールドを設定できるため、IDなどを上書きしようとする攻撃に対応しています。form
を作成、設定することでフォーム自体をカスタマイズすることができます。- 新規作成の成功・失敗に応じて呼ばれるメソッドをオーバーライドして独自のフックを追加することが可能です。
使い方
さて、では実際にどのように記述するのか見てみます。
モデルはこんな感じだと思ってください。
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
from django.views.generic import CreateView
from .models import Article
class ArticleCreateView(CreateView):
model = Article
fields = ['title', 'content', ]
success_url = '/'
こんな風になります。
fields
というのはその名の通りフィールドなのですが、ここに設定したフィールド以外は無視されます。
テンプレートでは、自動で生成されている変数form
を使います。
<form method="post">
{% csrf_token %}
{{ form }}
</form>
のようにします。
クラスベース汎用ビューで生成されるフォームでは、基本的に<form>
を自分で書く必要があります。
なぜかはわかりませんが、フォームを二つまとめて一度に更新したい時に役立ちますから、きっとそういうニーズに応えてのことと思います。
注意点
以前の二つと違うのはフォームが必要になる、ということです。
ただ、カスタマイズしなくてもよい場合はデフォルトのフォームで十分です。
また、テンプレート名が後述するUpdateView
と同じです。
内容も同じなので効率的と言えば装なのですが、タイトルを変更したい時などは条件分岐するか専用のテンプレートにする必要があります。
※ Formについては別稿とします。
まとめ
CreateViewはユーザーと対話する基本的なビューです。
よく使いますが、運用していると更新の方が多かったりするのでふれあう機会が減ってしまいがちです。