форма django повторно отправляется после обновления - PullRequest
22 голосов
/ 28 апреля 2011

После того, как я отправляю форму в первый раз, а затем обновляю форму, она отправляется повторно, а я этого не хочу.

Вот моя форма в шаблоне:

<form action = "" method = "POST"> {% csrf_token %}
    {{ form.as_p }}
    <input type = "submit" value = "Shout!"/>
</form>

Как я могу это исправить?

Вот мои взгляды:

def index(request):
    shouts = Shout.objects.all()

    if request.method == "POST":
        form = GuestBookForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            shout = Shout(author = cd['author'], message = cd['message'])
            shout.save()
            form = GuestBookForm()
    else:
        form = GuestBookForm()

    return render_to_response('guestbook/index.html', {'shouts' : shouts,
                                             'form' : form },
                              context_instance = RequestContext(request))

Ответы [ 3 ]

36 голосов
/ 28 апреля 2011

Я думаю, что это проблема, на ваш взгляд.

После успешной отправки и обработки веб-формы вам необходимо использовать возврат HttpResponseRedirect , даже если вы перенаправляете только в одно и то же представление.В противном случае некоторые браузеры (я уверен, что FireFox делает это) в конечном итоге отправят форму дважды.

Вот пример того, как с этим справиться ...

def some_view(request):
  if request.method == "POST":
    form = some_form(request.POST)
    if form.is_valid():
      # do processing
      # save model, etc.
      return HttpResponseRedirect("/some/url/")
  return render_to_response("normal/template.html", {"form":form}, context_instance=RequestContext(request))

Учитывая вашинедавно добавленное представление выше ...

def index(request):
    shouts = Shout.objects.all()

    if request.method == "POST":
        form = GuestBookForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            shout = Shout(author = cd['author'], message = cd['message'])
            shout.save()

            # Redirect to THIS view, assuming it lives in 'some app'
            return HttpResponseRedirect(reverse("some_app.views.index"))
    else:
        form = GuestBookForm()

    return render_to_response('guestbook/index.html', {'shouts' : shouts,
                                         'form' : form },
                          context_instance = RequestContext(request))

Это будет использовать reverse для перенаправления на это же представление (если это то, что вы пытаетесь сделать)

1 голос
/ 28 апреля 2011

Скорее всего: когда вы обновляете после отправки формы, вы снова показываете ту же страницу формы (не делая ничего). Вам нужно либо перенаправить на страницу записи, либо на новую страницу после отправки формы.

Таким образом, форма пустеет свои данные и не будет повторно отправляться при обновлении.

0 голосов
/ 15 марта 2017

Использовать HttpResponseRedirect

создать новое представление (скажем, thank_you) для успешного отображения сообщения после отправки формы и вернуть шаблон.

После успешной формыотправка do возврат HttpResponseRedirect ("/ thank-you /") в новый режим благодарности

from django.http import HttpResponseRedirect

def thank_you(request, template_name='thank-you.html'):
    return render_to_response(template_name,locals(),context_instance=RequestContext(request))

и в urls.py

url(r'^thank-you/$','thank_you', name="thank_you")

Несколькоотправка формы происходит потому, что когда страница обновляет тот же самый URL-адрес, который снова и снова вызывает тот же самый вид и, следовательно, несколько записей сохраняются в базе данных.Чтобы предотвратить это, мы должны перенаправить ответ на новый URL-адрес / представление, чтобы при следующем обновлении страницы он попадал на этот новый URL-адрес / представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...