Форма django повторно добавляется после обновления
После того, как я отправлю форму в первый раз, а затем обновить форму, она будет повторно отправлена, и я не хочу этого.
Здесь моя форма в шаблоне:
<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))
Ответы
Ответ 1
Я предполагаю, что это проблема в вашем представлении.
После успешной подачи и обработки веб-формы вам необходимо использовать return 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 для перенаправления на это же представление (если это то, что вы пытаетесь сделать)
Ответ 2
Скорее всего: когда вы обновляетесь после отправки формы, вы снова показываете ту же страницу формы (ничего не делая). Вам необходимо либо перенаправить на страницу записи, либо новую страницу после отправки формы.
Таким образом, форма будет пуста к ее данным и не будет повторно отправлена при обновлении.
Ответ 3
Используйте HttpResponseRedirect
создать новое представление (скажем, thank_you
) для успешного отображения сообщения после отправки формы и возврата шаблона.
После успешной отправки формы верните 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/view, чтобы обновить следующую временную страницу, он ударит по этому новому URL-адресу.