web-dev-qa-db-ja.com

コンテキストでDjangoにリダイレクトするにはどうすればよいですか?

フォームを検証して保存するビューがあります。フォームが保存された後、「顧客xyzのフォームが正常に更新されました...」という成功メッセージを表示してlist_objectビューにリダイレクトして戻したい

HttpResponseRedirectは、URLの引数しかなく、辞書を渡す方法がないため、動作するようには見えません。

Object_listのラッパーを変更して、必要なコンテキストを持つパラメーターとしてdictを取得しようとしました。フォームを保存するビュー内からこのラッパーへの呼び出しを返します。ただし、ページがレンダリングされるとき、URLは「/ list_customers /」ではなく「/ customer_form /」です。 object_listラッパーに渡す前に、リクエストオブジェクトを変更しようとしましたが、うまくいきませんでした。

ありがとう。

48
Kevin

ここで提案されている答えは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メッセージを含む回答を読む

22
Manoj Govindan

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 %}
72
Antoine Pinsard

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})
12
Federer