ユーザーが情報を入力した後、同じページにリダイレクトするフォームがあります(情報を入力し続けることができるようにするため)。フォームの送信が成功した場合、私は戻ってきます
HttpResponseRedirect(request.path)
これは正常に動作します。ただし、この場合もユーザーにいくつかのメッセージを表示したいと思います(例:画面の上部にある「データが保存されました」)。リダイレクトしていなかった場合は、これらのメッセージをコンテキストディクショナリに返します。ただし、リダイレクトではこれを行うことはできません。
では、HttpResponseRedirectを使用するときにテンプレートコンテキスト情報を渡すにはどうすればよいですか?
私がやろうとしていることは信じられないほど一般的だと思われるので、明らかなものがない場合は失礼します。
最善の方法は、おそらくリダイレクトURLでコード化されたクエリ文字列を使用することでしょう...それは古い学校のアプローチです。
あなたは次のようなことをすることができます
/ page /?m = 1、/ page /?m = 2など
次に、ビューコードでrequest.GETを使用してその変数を解析し、適切なメッセージを表示します。
完了および将来の参照のために、ここで メッセージフレームワーク を使用できます。インストールした後:
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 %}
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
できません。 HttpResponseRedirectはクライアント側リダイレクト(HTTPステータスコード302)をブラウザーに送信し、ブラウザーは別のページを再要求します。
リダイレクトにURLクエリ文字列を設定できますが、これはユーザーとHTTPリクエストをインターセプトしているすべてのユーザー(プロキシなど)に表示されるため、機密情報には適していません。
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 %}
リダイレクトでデータを渡すために知っている唯一の方法は、渡すパラメーターにGETパラメーターを追加することです。XSSハッキングを回避するには、次のような特定の定数を渡します。
[渡す現在のパス]?message = saved
次に、渡したパスのハンドラーでmessage = savedパラメーターを処理します。
やや複雑な方法は、リダイレクトでデータを渡さず、代わりに http://code.google.com/p/Django-notify/ のようなものを使用して、セッションベースのデータを格納することです。リダイレクト後にユーザーに表示されます。
クエリ文字列に?saved = 1を追加し、次のように確認します。
saved = request.GET.get('saved', False)