【Django】forms.pyの役割とはいったい何なのか?

Djangoでアプリを作ってみると、forms.pyというファイルを作成しているアプリが非常に多く目に入ります。
このforms.pyがなぜ必要なのか、そう思うことがあるかもしれません。

かくいう私もDjangoアプリを2年ほど前に作成した後はその保守ばかりをしていて、forms.pyを触ることがありませんでした。
ふと不思議に思ったので書籍や公式ドキュメントをひっくり返して学び返した形になります。

forms.pyが一体Djangoでどんな役割を担っているのかをこの記事では説明します。

forms.pyの役割とはいったい何なのか?

Djangoが使わせてくれる、とても便利な機能

この記事にたどり着いている段階で、あなたはDjangoアプリケーションの概要については知っているでしょう。
基本となる要素が「Model」「Views」「Template」ということも理解しているはずです。

このような3要素はDjangoのみならず、多くのWebアプリケーションで見るものです。
だからこそ、forms.pyというファイルがなぜ必要なのかと思ってしまうわけです。

結論から述べてしまうと、

forms.pyはViewsとTemplateを仲介する、便利な機能

ということになります。形にしては、次のようなものが近いでしょう。

同じ色で記載した通り、かなりViewsに近い性質を持っています。
forms.pyの有用性についてはDjangoの多くの目的の内、以下に当てはまります。

  • ウェブアプリケーションの構築を簡単にする
  • 素早く開発できる
  • コードを少なくする

つまり、forms.pyは使用しなくても構いませんが、使用することでWebアプリケーション開発をスピーディーにできるということです。

他の言語に触れたことがある場合、Djangoの記述量の少なさは身に染みて理解しているはずです。
ならばこのforms.pyについてもぜひ使っていきたい機能ですね。

具体的にforms.pyはどんなことができるのか?

forms.pyという名前の通り、Webアプリケーションにおけるフォームの開発の際に威力を発揮するのは理解できます。
ここで、一からフォームを作成した場合を考えてみましょう。その際、必要なことは多いです。

  • フォームの各要素(テキストボックスやプルダウンなど)
  • それぞれの要素のバリデーション
  • 送信データのシリアライズ処理
  • エラーの文言スペース

もちろんこれはあくまでも一例であり、DBに登録するならば登録処理が、更新ならばデータを取り出す処理なども該当します。

お問い合わせならばメールを飛ばす処理も必要ですね。
ご存じの通り、これらを一から作成するのは骨の折れる作業です。

しかしDjangoのforms.pyを使用すると、これらが驚くほど簡単に実装できます。
それこそ基本的な実装であれば、普段の半分以下の労力で済んでしまうほどです。

例えば上記の例であれば、

  • フォームの各要素を自動で作成してくれる
  • それぞれの要素を勝手にバリデーションしてくれる
  • エラーの出力場所や出力処理も自動

となります。もちろんこれらは最低限のフォームを作成する場合であって、カスタマイズすることも可能です。
これだけでも採用する価値は高いですよね。

フォームのバリデーションについて

バリデーションについてはViewsでも行うことができますが、フォームの入力値のチェックが様々な関数で必要になる場合に冗長になる傾向にあります。
forms.pyに記載することで、この冗長を回避できます。

例えば「文字列のテキストボックスに数値を入れてほしくない」というような入力に関する基本的なforms.pyで弾くのがおススメです。

一方で、そのフォーム限定で複雑なチェックが必要な項目に関してはViewsにて実装するのが良いでしょう。

Modelと連携したフォームを作ることもできる

forms.pyは「お問い合わせ」のような一般的なフォームにも使えますが、Modelと連携したフォームも作り出せます。
会員登録やログイン、マイページの登録者情報やコメントなどModelが絡むフォームの数は多岐にわたります。

例えば以下のような情報を持つModel「Post」を考えた場合、

  • user_name:ユーザー名
  • title:タイトル
  • content:本文
  • pub_date:公開日

単にforms.pyで「Post」とそれぞれのフィールドを指定するだけでこれら4つの要素を持つフォームを作成できます。

もちろん不要な要素は省くこともできますし、要素を加えることも可能です。
ログインや会員情報の変更のフォームをさっくりと作成する際に便利です。

forms.pyの役割とはいったい何なのか? おわりに

もちろん、ページによってはビジュアルがリッチなフォームを作成することもあるでしょう。
そのシステムの根幹ともいえるフォームにはこのforms.pyをカスタマイズするなどして対応するために、さっくりとは行かないかもしれません。

ですが一からViewsのみで作るよりは楽にフォームを作成できますし、その後の管理も楽なのは言うまでもないでしょう。
Djangoの特徴をいくつも掲載しているforms.pyの理解に役立ったなら幸いです。