web-dev-qa-db-ja.com

django POSTフォーム送信後にメッセージを表示

POSTフォームのページがあり、URLにアクションが設定されています。
i.eこのページのURLが/form_url/であると仮定します:..

/submit_url/のビューはフォームデータを処理します。この後、フォームの同じページに成功メッセージを返したいと思います。 POSTフォームを処理するビューでは、ブラウザからフォームデータを「クリア」するためにHttpResponseRedirectを使用します。しかし、この方法ではできません。次のようなことをしない限り、フォームページにメッセージを表示します。

return HttpResponseRedirect("/form_url/?success=1")

次に、テンプレートでこのパラメーターを確認します。ユーザーがページを更新しても、成功メッセージが表示されるため、この方法は好きではありません。

Django=管理サイトでは、オブジェクトの削除/追加では、POST submitの後にリダイレクトを使用し、何とか成功メッセージを表示します。 ?

私はすでにDjango "messaging"アプリを簡単に見ましたが、最初にどのように機能するかを知りたいです。

15
user3599803

Django adminはDjango.contrib.messages、次のように使用します。

あなたの見解では:

from Django.contrib import messages

def my_view(request):
    ...
       if form.is_valid():
          ....
          messages.success(request, 'Form submission successful')

テンプレートで:

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li  {% if message.tags %} class=" {{ message.tags }} " {% endif %}> {{ message }} </li>
    {% endfor %}
</ul>
{% endif %}
20
damio

Djangoメッセージフレームワークは、メッセージをセッションまたはCookieに保存します( storage backend に依存します)。

5
catavaran

フォームデータをクリアするためにリダイレクトを行う必要はありません。必要なのは、フォームを再インスタンス化することだけです。

def your_view(request):
    form = YourForm(request.POST or None)
    success = False
    if request.method == 'POST':
        if form.is_valid():
            form.save()
            form = YourForm()
            success = True
    return render(request, 'your_template.html', {'form': form})

ユーザーがページを更新すると、GETリクエストが開始され、successFalseになります。どちらの場合でも、フォームはGETまたはPOSTの成功時にバインド解除されます。

messages framework を活用する場合、メッセージが存在するかどうかを表示するためにテンプレートに条件を追加する必要があります。

2
Brandon
from Django.contrib.messages.views import SuccessMessageMixin
from Django.views.generic.edit import CreateView 
from myapp.models import Author

class AuthorCreate(SuccessMessageMixin, CreateView):
    model = Author
    success_url = '/success/'
    success_message = "%(name)s was created successfully"

https://docs.djangoproject.com/en/1.11/ref/contrib/messages/

1
Asif