デコレータでDjangoビューをオーバーライドする
-
22-07-2019 - |
質問
すでにログインしているユーザーをログインページから別のページにリダイレクトする必要がある状況があります。これは理にかなっているデコレータで達成できるという言及を見てきましたが、私はそれらを使うのはかなり新しいです。ただし、djangoログインとサードパーティビュー(django-registrationから)を使用しています。 django.contrib.authまたはdjango-registrationのコードを変更したくありません。目的の動作を得るために変更しないビューにデコレータを適用するにはどうすればよいですか。
事前に感謝します!
更新:ログイン機能を誤って登録モジュールに関連付けていることがわかりました。 django-registrationは、この問題とは関係ありません。ただし、デフォルトのlogin()動作をオーバーライドできるようにする必要があります。何か考えはありますか?
解決
さらに3つの方法がありますが、これらには独自のurlconfを使用する必要があります:
-
urlconfで直接ビューにデコレーターを追加します:
... (regexp, decorator(view)), ...
ただし、ビューとデコレータをurlconfにインポートする必要があるため、これが気に入らないのです。 urls.pyにはできるだけ少ない数のインポートを含めることを好みます。
-
ビューを
<app>/views.py
にインポートし、そこにデコレータを追加します:import view view = decorator(view)
Vinayのメソッドにかなり似ていますが、urlconfが必要なので、より明示的です。
-
ビューを新しいビューでラップします:
import view @decorator def wrapperview(request, *args, **kwargs): ... other stuff ... return view(request, *args, **kwargs)
最後のビューは、汎用ビューを変更する必要がある場合に非常に便利です。とにかくこれは私がよくやることです。
urlconfを使用するときは常に、パターンの順序が重要であるため、最初に呼び出されるパターンをシャッフルする必要がある場合があります。
他のヒント
decorator関数があり、django-registrationのどのビューをデコレートしたいかがわかっている場合は、単に行うことができます
registration.view_func = decorator_func(registration.view_func)
ここでregistration
は、装飾するビュー関数を含むdjango-registrationのモジュール、view_func
は装飾するビュー関数、decorator_func
はデコレータです。 。