2009-09-23 4 views
31

ユーザーが情報を入力した後も同じページにリダイレクトするフォームがあります(情報を入力し続けることができます)。フォームの提出が成功した場合、返信します。DjangoでHttpResponseRedirectを使用するときにテンプレートコンテキスト情報を渡すにはどうすればよいですか?

HttpResponseRedirect(request.path) 

うまくいきます。ただし、この場合、ユーザーにいくつかのメッセージを表示することもできます(たとえば、画面の上部に「あなたのデータは保存されました」など)。私がリダイレクトしていない場合は、これらのメッセージをコンテキスト辞書に戻すだけです。しかし、リダイレクトでは、私はこれを行うことはできません。

したがって、HttpResponseRedirectを使用しているときにテンプレートコンテキスト情報を渡すことはできますか?

私がしようとしていることは、それが信じられないほど一般的であるように思えます。

+0

は、これらのログイン中のユーザーですか? –

+0

2番目のページの読み込みは、ブラウザからの別の別の要求の後に行われます(最初の応答は302を返します)ので、HttpResponseRedirectの使用が期待されるように、ビュー間で情報を渡すことはできません。 IMHO、セッションフレームワークはリクエスト間で情報をやり取りする最も簡単な方法です。 –

答えて

5

おそらく、リダイレクトURLにコード化されたクエリ文字列を使用するのが最善の方法です...古い学校のアプローチです。

あなたは

/ページ/?m = 1のような何かを行うことができ、/ページ/?M = 2、など

あなたは、ビューのコードとショーにrequest.GETでその変数を解析します適切なメッセージ

6

できません。 HttpResponseRedirectはクライアント側リダイレクト(HTTPステータスコード302)をブラウザに送信し、ブラウザは別のページを再度要求します。

リダイレクトでURLクエリ文字列を設定できますが、これはユーザーやHTTPリクエスト(つまりプロキシ)を傍受するユーザーには見えますが、機密情報には適しません。

+2

セッションのフレームワークはどうですか? –

0

あなたは、クエリ文字列に保存された= 1を追加し、ようなもので、それをチェック:リダイレクトで任意のデータを渡すために私の知っている唯一の方法は、URLにGETパラメータを追加することです

saved = request.GET.get('saved', False) 
1

? =

[あなたが渡している現在のパス]メッセージ

を保存し、メッセージ=保存されたパラメータを処理する:?。あなたはXSSはあなたのような特定の定数を渡したいと思いハッキング回避するために渡していますあなたが渡したパスのハンドラで。

もう少し複雑な方法は、リダイレクトでデータを渡さず、http://code.google.com/p/django-notify/のようなものを使用して、リダイレクト後にユーザーに表示されるセッションベースのデータを保存することです。

10

あなたが認証を使用していて、ユーザーに可能性がログインしている場合:

http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.message_set.create

はのparamsもハッキングされているGET。他の答えで言及されているように、クエリ文字列を使うこともできます。

セッションフレームワークを使用するのが最も望ましい方法だと思います。あなたがコンテキストで好きなアップロードし、

{{ request.session.foo }} 

fooを得ることができますこの方法は、メッセージ可能性があります。また、行うことができます:

{% ifequal request.session.foo 1 %} Nice work! {% else %} Almost! {% endifequal %} 

や他の楽しいこと。あなたがあなたのhast views.pyから

http://docs.djangoproject.com/en/dev/topics/http/sessions/#using-sessions-in-views

+0

as request.session ['foo'] = 1? –

+0

はい、2番目のテンプレートコード。最初のテンプレートスニペットでは、ロジックに応じてメッセージ全体を配置することができます。 –

+0

私はDjangoでどのように簡単なセッションを使用するのか分からなかった...これを提案してくれてありがとう。私はこの方法を利用し、非常にうまく動作します。 – nicorellius

0

は、セッションにキー/値ペアを配置し、HTMLテンプレートからそれを読まなければなりません。例えば

:完了し、将来の参照の便宜上

views.py

# your code here 
request.session['vote'] = 1 
return HttpResponseRedirect(request.path) 

your_template.html

{% ifequal request.session.vote 1 %} 
    <!-- Your action here --> 
{% endifequal %} 
+0

古い回答ですが、このようなものが私がここで尋ねた質問に使用できると思われます:http://stackoverflow.com/questions/41317128/using-httpresponseredirect-in-a-django-view-where-context-hasあなたが時間を持っているなら、それにあなたの考えを聞くのが大好きです:-) –

45

、あなたは今the messages frameworkを使用することができます。あなたがそれをインストールした後:

views.py

from django.contrib import messages 

def view(request): 
    # your code 
    messages.success(request, "Your data has been saved!") 
    HttpResponseRedirect(request.path) 

template.html

{% if messages %} 
<ul class="messages"> 
    {% for message in messages %} 
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
    {% endfor %} 
</ul> 
{% endif %} 
関連する問題