質問

すでにログインしているユーザーをログインページから別のページにリダイレクトする必要がある状況があります。これは理にかなっているデコレータで達成できるという言及を見てきましたが、私はそれらを使うのはかなり新しいです。ただし、djangoログインとサードパーティビュー(django-registrationから)を使用しています。 django.contrib.authまたはdjango-registrationのコードを変更したくありません。目的の動作を得るために変更しないビューにデコレータを適用するにはどうすればよいですか。

事前に感謝します!

更新:ログイン機能を誤って登録モジュールに関連付けていることがわかりました。 django-registrationは、この問題とは関係ありません。ただし、デフォルトのlogin()動作をオーバーライドできるようにする必要があります。何か考えはありますか?

役に立ちましたか?

解決

さらに3つの方法がありますが、これらには独自のurlconfを使用する必要があります:

  1. urlconfで直接ビューにデコレーターを追加します:

    ...
    (regexp, decorator(view)),
    ...
    

    ただし、ビューとデコレータをurlconfにインポートする必要があるため、これが気に入らないのです。 urls.pyにはできるだけ少ない数のインポートを含めることを好みます。

  2. ビューを<app>/views.pyにインポートし、そこにデコレータを追加します:

    import view
    
    view = decorator(view)
    

    Vinayのメソッドにかなり似ていますが、urlconfが必要なので、より明示的です。

  3. ビューを新しいビューでラップします:

    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はデコレータです。 。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top