DjangoフレームワークでFormPreviewでも@login_requiredを使いたい
後輩たちと開発中のプロジェクトで,「要ログインな箇所で確認画面を挟むフォームを実装したい」なんて状況があった.
日本語のソースがまったくなかったのでネタになるかな.ほとんど英語ソースの抜粋だけど.
とりあえず前知識.
@login_requireはDjangoで提供されている関数デコレータ.
Djangoでは各URLに関数にバインドさせて,飛んできたリクエストを処理する.
このデコレータを使うとバインドした部分においてログインを要求することができる.
@login_requireについて
一方で,FormPreviewはよくある「確認画面を挟んだフォーム」を簡単に実装できるDjangoモジュール.
もちろん使わなくても確認画面を(ryは実装できるのだけど,コードが入り組んで気持ち悪い.
(FormPreviewを使っても十分気持ち悪いけど)
こいつを使う際にはURLとクラス(の__call__メソッド)をバインドさせるので,
通常と同様の操作では@login_requireが使えない.
FormPreviewについて
解決策
結論だけ書くと,以下のようにurl.pyでlogin_requireを関数として使っちゃう.
#url.py
from django.contrib.auth.decorators import login_required
urlpatterns = patterns('', url(r'^message/$', login_required(MessageFormPreview(MessageForm))))
元ネタでは,他にも(1)FromPreviewをラッパーする関数を用意したり,(2)FormPreviewクラスの__call__をオーバーライドする方法が紹介されている.
しかしながら,FormPreviewクラスに手を加えてしまっていたり,余分な関数を追加してしまうという理由で,元ネタ中で却下されていた.