web-dev-qa-db-ja.com

DjangoでHttpResponseRedirectを使用するときにテンプレートコンテキスト情報を渡すにはどうすればよいですか?

ユーザーが情報を入力した後、同じページにリダイレクトするフォームがあります(情報を入力し続けることができるようにするため)。フォームの送信が成功した場合、私は戻ってきます

HttpResponseRedirect(request.path)

これは正常に動作します。ただし、この場合もユーザーにいくつかのメッセージを表示したいと思います(例:画面の上部にある「データが保存されました」)。リダイレクトしていなかった場合は、これらのメッセージをコンテキストディクショナリに返します。ただし、リダイレクトではこれを行うことはできません。

では、HttpResponseRedirectを使用するときにテンプレートコンテキスト情報を渡すにはどうすればよいですか?

私がやろうとしていることは信じられないほど一般的だと思われるので、明らかなものがない場合は失礼します。

40
Jeff

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

あなたは次のようなことをすることができます

/ page /?m = 1、/ page /?m = 2など

次に、ビューコードでrequest.GETを使用してその変数を解析し、適切なメッセージを表示します。

7
M. Ryan

完了および将来の参照のために、ここで メッセージフレームワーク を使用できます。インストールした後:

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 %}
57
João Pesce

authを使用していて、ログインしているユーザーがいる場合、次のことができます。

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

GETパラメータもハッキング可能です。他の回答で述べたように、クエリ文字列を使用できます。

セッションフレームワークを使用するのが最も望ましい方法だと思います。そうすれば、コンテキスト内で必要なものをすべてロードして取得できます

{{ request.session.foo }} 

fooはメッセージの場合もあれば、次のような場合もあります。

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

その他の楽しいもの。

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

11
Skylar Saveland

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

リダイレクトにURLクエリ文字列を設定できますが、これはユーザーとHTTPリクエストをインターセプトしているすべてのユーザー(プロキシなど)に表示されるため、機密情報には適していません。

6
dcrosta

Views.pyから、キー/値のペアをセッションに入れて、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  %}
2

リダイレクトでデータを渡すために知っている唯一の方法は、渡すパラメーターにGETパラメーターを追加することです。XSSハッキングを回避するには、次のような特定の定数を渡します。

[渡す現在のパス]?message = saved

次に、渡したパスのハンドラーでmessage = savedパラメーターを処理します。

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

1
Ben Regenspan

クエリ文字列に?saved = 1を追加し、次のように確認します。

saved = request.GET.get('saved', False)
0
Jeff Ober