2012-01-14 2 views
0

私はPython 2.7,Django 1.3.1を使用しています。Djangoはバインドされた形式の別のビューにリダイレクトします

任意のページから呼び出すことができるサインイン機能を実装しようとしていますが、コードの重複がなくても同じページにリダイレクトされます。私が現在持っている方法は、ホームページとサインインの2つのビューを持っていることです。のフォームでsign_inビューからホームビューにリダイレクトできます。主な問題は、ユーザーが間違ったデータ(パスワードが間違っているなど)を入力すると、同じページにリダイレクトしたいが元のフォームのコンテキストを送信したいということです。私は明示的にビュー関数を呼び出さずにこれを行うことができるようにしたいので、私は任意のページからそれを行うことができるようにしたい。これはどうすればいいですか?私の現在の試みは、データが無効である場合には常にアンバウンドフォームを返します。

私の現在のコードは、(simplfied)である:

urls.py

urlpatterns = patterns('myapp.views', 
    url(r'^$', 'index', name='home'), 
    url(r'sign_in/^$', 'signin', name='sign_in') 
) 

views.py

def index(request, loginForm=LoginForm) 
    extra_context = dict() 
    extra_context['login_form'] = loginForm 
    return direct_to_template(request, 'home.html', extra_context=extra_context) 

def signin(request) 
    if request.method == 'POST': 
     login_form = LoginForm(request.POST, request.FILES) 
     if login_form.is_valid(): 
      # login user 
     redirect_view = reverse('home') 
     return redirect(redirect_view, kwargs={'loginForm': login_form}) 
     # I also tried: 
     # return redirect(redirect_view, loginForm=login_form) 
     # what works is: 
     # return index(request, loginForm = login_form) 

home.html

答えて

2
<form action="{% url sign_in %}" method="post"> 
    {{ form.as_p }} 
</form> 

逆ではありません。 Reverseはあなたにパス/ my-homepageを与えます/

このためのdjangoパラダイムは、最初のページに隠れた "次の"変数セットを使用することです。

#In your template 
<input type="hidden" value="{{ request.path }}" name="next" /> 

その後、成功にHttpResponseRedirect次に戻ります。問題がある場合、あなたは/アカウント/ログイン/ページでのエラーのあるフォームを表示するので、これは、耐久性のある

 if login_form.is_valid(): 
     # login user 
     return HttpResponseRedirect(form.cleaned_data['next']) 

隠された次の変数とユーザーはまだどこに戻ってきますか。

+0

これは、成功すると単にオリジンページにリダイレクトされます。私はlogin_formが有効でないときに懸念しています。私は元のページに対応するビューにリダイレクトしたいと思います(エラーへのリンクは、 'next'パラメータで取得できます)、エラーを示すフォームがバインドされています。 – saurabh

+0

それはかわいいかもしれませんが、災害でもあります。エラーが発生した場合は、エラーを修正するために明示的に焦点を合わせた単一のページにユーザーを配置しないようにしますか? – Ted

+0

はい。これは実現可能な解決策の1つですが、ユーザーが異なるように見えるページにリダイレクトされるという欠点があります。失敗したリダイレクトが同じページに実行できるかどうかを知りたい答えはいいえと思われますか? – saurabh

関連する問題