CreateView

次はCreateViewです。



それはなにか

CreateViewはモデルと連携して、データの新規保存を請け負います。

通常のウェブサイトでは、通常フォームを使用してユーザーからのデータを受け取ります。

CreateViewは受け取ったデータを精査して、モデルに設定されたフィールドに適したデータなのかを確認します。 いわゆるバリデーションです。

保存するのに支障が無ければ保存をモデルに依頼します。 そして、モデルがデータを保存します。

最後に、success_urlで示されたURLか、get_success_urlで返されたURLに移動します。

これが、CreateViewの動作です。

どんないいことがあるのか

  • モデルにを定義した段階で、すでにバリデーションの条件を記載したことになりますので、いちいちバリデーション内容を記述する必要がありません。

  • fieldsによって受け入れるフィールドを設定できるため、IDなどを上書きしようとする攻撃に対応しています。

  • formを作成、設定することでフォーム自体をカスタマイズすることができます。

  • 新規作成の成功・失敗に応じて呼ばれるメソッドをオーバーライドして独自のフックを追加することが可能です。

使い方

さて、では実際にどのように記述するのか見てみます。

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はユーザーと対話する基本的なビューです。

よく使いますが、運用していると更新の方が多かったりするのでふれあう機会が減ってしまいがちです。


初稿: 2019年11月25日22:29 | 最終編集: 2019年11月26日0:03