djangoのフォームを扱うビュー3種類

フォーム入力画面を作成するには、

  • CreateViewクラスをオーバーライドする方法
  • FormViewクラスをオーバーライドする方法
  • 関数ビューで自分で書く方法

の主に3種類があります。

以下は、まったく同じ動きをするフォームを、3種類の書き方で書いています。(フォームのクラスはforms.pyで別途定義してあるものとします。)

  • CreateViewクラスをオーバーライドする方法

CreateViewクラスは、FormViewクラスをオーバーライドした、フォームからのデータ登録に特化したクラスです。

単純に入力→保存を行うような機能がめちゃくちゃ簡単にできます。テンプレートは指定がなければ、アプリ名_form.htmlがデフォルトテンプレートとなります。

 

  • FormViewクラスをオーバーライドする方法

CreateViewは値が正しければDBに自動的に登録してくれるクラスですが、FormViewはそのままでは登録までは勝手にしてくれません。

送られた値が正しかった時に他に何かしたい、といった時に使うのがいいのではないかと思います。

 

  • 関数ビューで自分で書く方法

FormViewクラスに比べ、テンプレートへのレンダリングなども含みます。

sessionやcookieに何か保存したり呼び出したりなど、仕様を細かく指定した時には自分で関数ビューを書いた方が良いです。

 

以上、備忘録。

djangoの関数ビューでログイン必須にする

djangoのビューにおいて、クラスビューの場合はLoginRequiredMixinを渡しておけば勝手にログイン必須になるのでいいのですが、関数ビューの場合は引数の制限の関係でこの方法が使えません。

なので、login_requiredクラスを別に読み込んで書く必要があります。

  • クラスビューの場合

  • 関数ビューの場合

 

以上、備忘録。

Djangoのアプリ管理画面でユーザのフルネームを表示させる

フレームワークって、決まったことをやる分にはめちゃくちゃ速く開発出来ちゃうけど、ほんのちょっとここをこうしたいって時に、仕様が理解できてないと、ものすごい時間と労力を取られることがある、、。

Djangoで作成したアプリのモデルを定義すると、管理画面上に自動的にレジスターが出てくるので非常に便利。

でもそのレジスターを一覧表示した時、外部キー(foreignkey)で紐づけたユーザ情報が、デフォルトだとユーザ名(ログインID)になってしまう。

せっかくカスタムユーザモデルを定義したのだから、ここにフルネームを出したい。

カスタムユーザモデルを修正。

マイグレーション忘れずに。

するとアプリのレジスター画面で 以下のように表示される。

とりあえずこれでOK。

ただしUSERNAME_FIELDはユーザのレジスターやアクティベーションに関係してくるので、外部向けの新規ユーザ登録画面などを作った時に、弊害が出てくる可能性も、、、。

もうちょっと勉強が必要かな。

6/13追記:

さっそく弊害出ました。フルネームがユーザ名として扱われるようになったため、管理画面にログインする際のIDもフルネームで判定されるようになってしまいました。元に戻しました、、、。