フォームを検証して保存するビューがあります。フォームが保存された後、「顧客xyzのフォームが正常に更新されました...」という成功メッセージを表示してlist_objectビューにリダイレクトして戻したい
HttpResponseRedirectは、URLの引数しかなく、辞書を渡す方法がないため、動作するようには見えません。
Object_listのラッパーを変更して、必要なコンテキストを持つパラメーターとしてdictを取得しようとしました。フォームを保存するビュー内からこのラッパーへの呼び出しを返します。ただし、ページがレンダリングされるとき、URLは「/ list_customers /」ではなく「/ customer_form /」です。 object_listラッパーに渡す前に、リクエストオブジェクトを変更しようとしましたが、うまくいきませんでした。
ありがとう。
ここで提案されている答えはDjango <1.2:にのみ適用されることに注意してください
リダイレクト先のビューを制御できますか?その場合、リダイレクトする前にセッションにコンテキストを保存できます。ターゲットビューは、セッションからコンテキストを取得(および削除)し、それを使用してテンプレートをレンダリングできます。
only要件がメッセージを表示することである場合、これを行うためのより良い方法があります。最初のビューは、auth
を使用して現在のメッセージを作成し、2番目のビューにそれを読み取らせて削除させることができます。このようなもの:
def save_form(request, *args, **kwargs):
# all goes well
message = _("form for customer xyz was successfully updated...")
request.user.message_set.create(message = message)
return redirect('list_view')
def list_view(request, *args, **kwargs):
# Render page
# Template for list_view:
{% for message in messages %}
...
{% endfor %}
メッセージはデータベースに保存されます。これは、リダイレクト後でもアクセスできることを意味します。テンプレートのレンダリング時に自動的に読み取られ、削除されます。これを機能させるには、RequestContext
を使用する必要があります。
For Django => 1.2メッセージを含む回答を読む
request.user.message_set
はDjango 1.2で廃止され、Django 1.4以降、 メッセージフレームワーク を代わりに使用する必要があります。
from Django.contrib import messages
# messages.add_message(request, level, message, extra_tags='', fail_silently=False)
messages.add_message(request, messages.INFO, "Your Message")
メッセージはテンプレートで次のようにレンダリングできます:
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
Antoineの役立つ答えを拡張するには:テンプレートではなくビューモジュールでメッセージを処理する場合:
from Django.contrib.messages import get_messages
def my_view(request):
# Process your form data from the POST, or whatever you need to do
# Add the messages, as mentioned above
messages.add_message(request, messages.INFO, form.cleaned_data['name'])
return HttpResponseRedirect('/other_view_url/')
def other_view(request):
storage = get_messages(request)
name = None
for message in storage:
name = message
break
return render(request, 'general/other_view.html', {'name': name})