django表单在刷新时重新提交

Mar*_*jus 24 forms django

在我第一次提交表单然后刷新表单后,它会重新提交,我不希望这样.

这是模板中的表单:

<form action = "" method = "POST"> {% csrf_token %}
    {{ form.as_p }}
    <input type = "submit" value = "Shout!"/>
</form>
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题 ?

这是我的看法:

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))
Run Code Online (Sandbox Code Playgroud)

Bra*_*ant 40

我的猜测是,你认为这是一个问题.

成功提交和处理Web表单后,即使您只是重定向到同一视图,也需要使用返回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))
Run Code Online (Sandbox Code Playgroud)

鉴于您最近在上面添加的视图...

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))
Run Code Online (Sandbox Code Playgroud)

这将使用反向重定向到同一个视图(如果那是你想要做的)

  • 我想,点对点。在OP提出观点之前,我有一种预感并回答了这个问题。 (2认同)

小智 6

尝试:

return redirect ('url', parameter_if_needed)

代替

return render (request, 'name.hmtl', context)

就我而言,它工作得很好。