質問

これは私のログインビューです:

def login(request):

    redirect_to = request.REQUEST.get("next")
    if request.method == 'POST': 

        formL = LoginForm(data=request.POST)           
        if formL.is_valid(): 

            if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
                redirect_to = "/blogs/"

            from django.contrib.auth import login
            login(request, formL.get_user())
            if request.session.test_cookie_worked():
                request.session.delete_test_cookie()
            return HttpResponseRedirect(redirect_to)

    else:

    formL = LoginForm(request)                 

request.session.set_test_cookie()  

return render_to_response('blogs.html', {
    'formL': formL, }, context_instance=RequestContext(request))

ログイン = Never_cache(ログイン)

たとえば、example.com/myblog/ にアクセスすると、example.com/accounts/login/?next=/myblog/ にリダイレクトされます。

しかし、ログインのために user と psw を挿入すると、/myblog/ ではなく /blogs/ にリダイレクトされます。

なぜ ?

編集:request.REQUEST.get('next', '') は常に '' を返します

理由がわからない :-\

役に立ちましたか?

解決

ログインフォームのテンプレートはどのようなものですか?

あなたの問題

あなたが送っているのは、 redirect_to テンプレートへのパスを追加する必要があります。戻り値は次のようになります。

return render_to_response('blogs.html', {
        'formL': formL,
        'next': redirect_to,
    }, context_instance=RequestContext(request)
)

ログイン フォームのアクションは次のようになります。

<form action="/your_login_url/?next={{ next }}" method="post">

それで、あなたが行くときは、 /myblog/ にリダイレクトされます /your_login_url/?next=/myblog/, 、ログイン ビューはログイン フォームをレンダリングし、 next ログインフォームのアクション属性の変数は次のようになります /your_login_url/?next=/myblog/ フォームを送信すると、ログインしてリダイレクトされます。 /myblog/ (その後のこと if request.method == 'POST': 実行されます)。

あなたの見解では、 redirect_to = request.REQUEST.get("next") あなただけの場合は正常に動作します GET ログインページですが、 POST それはありません next GETで設定した変数。

こちらも注意

ログイン ビューではブログをレンダリングする必要はなく、ブログ ビューでレンダリングする必要があります。

Django から返される応答は次のようになります。次の行に注目してください。 redirect_field_name: redirect_to,, redirect_field_name の値があります next デフォルトでは。

return render_to_response(template_name, {
    'form': form,
    redirect_field_name: redirect_to,
    'site': current_site,
    'site_name': current_site.name,
}, context_instance=RequestContext(request))

そして、デフォルトのリダイレクトのためにのみログインビューをオーバーライドするようですか?私見ですが、これは正しくありません。ログイン リダイレクトのデフォルトの場所を設定する適切な場所は、settings.py です。 LOGIN_REDIRECT_URL.

しかし、独自のログイン ビューを作成しているのですから、django のログイン ビューをスケルトンとして使用し、必要なものを拡張してみてはいかがでしょうか。

他のヒント

タグので、
 not redirect_to or '//' in redirect_to or ' ' in redirect_to

trueと評価された?

<時間>

私たちは魚に男を教えるたぶん場合は? http://docs.python.org/library/logging.htmlする

先頭にこれを入れて
import logging
LOG_FILENAME = '/tmp/logging_example.out'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)

それはあなたのコード内で適切と思われる場所(例えばif文の後)にこれを入れて

logging.debug("redirect_to = %s" % redirect_to)

ファイル名を指定して実行それは、 '/tmp/logging_example.out'

の内容を見ます
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top