9

django.contrib.auth素晴らしい機能があります。で装飾されたページにアクセスしようとするlogin_requiredと、引数を指定してログインページにリダイレクトされるため、ログインnext後、最初にアクセスしようとしていたページにリダイレクトされます。これはユーザーフローにとって良いことです。

しかし、どうやらdjango-registration同様の機能を提供していません。ログインの代わりに登録すると、next何かが得られると思いました。登録-n'-アクティブ化すると、最初にアクセスしようとしていたページにリダイレクトされます。これは当てはまりません。成功ページにリダイレクトされるだけです。これは流れを傷つけます。

django-registrationおそらくこのオプションを提供していますが、私はそれを使用していないか、正しく使用していませんか?または、これを行う簡単な方法はありますか?

4

2 に答える 2

12

電子メール ( registration.views.activate ) によるアカウントのアクティブ化を担当するビューを見ると、 「成功したアクティブ化でリダイレクトする URL パターンの名前」であるsuccess_urlパラメーターを受け入れることがわかります。

したがって、そのビューを呼び出す URL を上書きし、リダイレクト先のページを指定するだけです。

したがって、独自のurls.pyで:

from registration.views import activate
urlpatterns = patterns('',
    url(r'^activate/(?P<activation_key>\w+)/$',
            activate,
            {'backend': 'registration.backends.default.DefaultBackend'},
            name='registration_activate',
            # You could use reverse() here instead of a URL to be DRY'er
            success_url = "http://..." 
            ),

または、独自のビューで django-registrations activate ビューをラップし、GET パラメータを受け入れてリダイレクトすることもできます。

from registration.view import activate
def custom_activate(request, backend,
         template_name='registration/activate.html',
         success_url=None, extra_context=None, **kwargs):
    success_url = request.GET.get('next', None)
    return activate(request, template_name=template_name, success_url=success_url, extra_context=None, **kwargs)

これで、テンプレートregistration/activation_email.htmlで、リダイレクト先をリンクに追加できます。

{% url 'registration.view.activate' activation_key as a_url %}

Thanks! ....

{% autoescape off %}
<a href="http://{{ site.domain }}{{ a_url }}?next='http://somepage_or_url'">
    http://{{ site.domain }}{{ url_registration_activate }}/
</a>
{% endautoescape %}

Thanks!

編集

わかりましたので、上記はハードコーディングされたリダイレクトを扱っています。これがあなたが望むフローだと思います:

  1. ユーザーがページに移動しようとしています
  2. ユーザーがログイン/登録ページにリダイレクトされる
  3. ユーザーがそのページでサインアップすると、メールが送信されます
  4. ユーザーが電子メールを有効にすると、表示しようとした元のページにリダイレクトされます

これは、ステップ 1 で表示しようとしていたページをステップ 4 までずっと渡す必要があるため、より困難です。ご存知のように、HTTP はステートレスです。

頭に浮かぶ最初の提案は、登録時にリダイレクトをセッション変数に保存し、アクティブ化するときにそれを取得することです。これを行うには、django-registrations のデフォルトのバックエンド(登録プロセスの機能を概説し、ビューから呼び出されるメソッドを持つ単なるクラス)、具体的には register メソッドと post_activation_redirect メソッドを上書きします。

custom_backend.py

from registration.backends.default import DefaultBackend
class RedirectBackend(DefaultBackend):
    def register(self, request, **kwargs):
        request.session['redirect'] = request.GET.get("next",None)
        super(RedirectBackend, self).register(request, **kwargs)

    def post_activation_redirect(self, request, user):
        return(request.session['redirect'], (), {})

そして、django-registration が実際にこのバックエンドを使用することを確認するために、urls.py を介してビューに提供します。

url(r'^activate/(?P<activation_key>\w+)/$',
    activate,
    {'backend': 'custombackend.RedirectBackend'},
    name='registration_activate'),
url(r'^register/$',
    register,
    {'backend': 'custombackend.RedirectBackend'},
    name='registration_register'),
于 2011-10-31T09:45:00.413 に答える
-4

同じデコレータ@login_requiredを使用する必要があります。django-registrationもそれを使用します。

于 2011-10-29T05:00:21.957 に答える