2017-08-03 5 views
1

私はウェブサイトを構築しており、私たちのページから見積もりを求める様々なビューが必要です。可能であればDRYとしてコードを保存したいので、さまざまなビューから見積もり要求を受け取るビューquoteを作成しています。要求を行ったページにリダイレクトされた検証エラーがある場合は、私はこれを超悪い習慣の「グローバル変数」を使って解決しました。より良い解決策が必要な場合は、現在のフォームでそれぞれのビューにリダイレクトしたいので、form.errorsを反復処理することができます。ここに私のコードは次のとおりです。別のビューにフォームを送信するdjango

def send_quote(request): 
    form = Quote(request.POST) 
    if form.is_valid(): 
     # do stuff when valid 
     return redirect('Support:thanks', name=name or None) 
    quote_for = request.POST['for_what'] 
    global session_form 
    session_form = form 
    return redirect('Main:' + quote_for) # Here I would like to send form instead of storing in global variable` 

答えて

1

あなたはHttpResponseRedirect機能を使用し、引数として要求を行ったページを渡すことができます。

return HttpResponseRedirect(request.META.get('HTTP_REFERER')) 

詳細を確認したい場合は、すべてのMETAデータが辞書に保存されています。

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.META

+0

私はそれを試して、リクエストを送信した最後のページにリダイレクトしますが、リダイレクト後もまだ利用可能なフォームですか? –

+0

'HttpResponseRedirect'はクラスです。 –

+0

セッションを使用してフォームを保存すると、リダイレクトするページが正しく処理されます。 –

0

あなたがリファラにリダイレクトする場合、リダイレクトは常にGET要求であるとして、form.errorsは、空になります。私はあなたの問題には2つの解決策を考えることができ

  1. 非同期JavaScriptを使用してフォームを送信し、そのエラー
  2. は、フォームのサポートPOSTを含むすべてのビューを作る移入 - これを行うための一つの方法は次のようになりますFormView

2番目のオプションは、Djangoでフォームを処理する典型的な方法です。POSTとGETの両方を同じビュー内で処理します。

-1

検索の2日後、最終的に答えが見つかりました。 formrequest.sessionに保存する代わりに、request.POSTを保存してからリダイレクトするだけです。ここでは、コードは次のようになります。

def send_quote(request): 
    form = Quote(request.POST) 
    if form.is_valid(): 
     # do stuff when valid 
     return redirect('Support:thanks', name=name or None) 
    quote_for = request.POST['for_what'] 
    request.session['invalid_form'] = request.POST 
    return redirect('Main:endview') 

def endview(request): 
    session_form = request.session.pop('invalid_form', False) 
    if session_form: 
     form = Quote(session_form) 
     # render template again with invalid form ;) 

今、私は私が望むすべてのビューでこれを繰り返すことができ、ちょうどそれぞれのビューを(私が意図したように)一致するように、各フォームのwhat_for入力を変更します。

+0

ユーザーが複数のブラウザタブを使用する場合、これは期待どおりに機能しません。 –

+0

リダイレクトにかかる時間だけセッションを保存しています。リダイレクト後、ユーザーが自分のサーバーにアクセスでき、ブレークポイントを追加できる場合を除いて、セッションから値を完全に削除しています –

関連する問題