2011-04-28 45 views
15

Después de enviar el formulario por primera vez y luego actualizar el formulario, se vuelve a enviar y no quiero eso.formulario django reenviado al actualizar

Aquí es mi forma de plantilla:

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

¿Cómo puedo solucionar este problema?

He aquí mis puntos de vista:

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)) 
+0

explique sus puntos de vista – vad

Respuesta

32

Supongo que este es un problema en su vista.

Después de la presentación y el procesamiento exitosos de un formulario web, debe utilizar un retorno HttpResponseRedirect, incluso si solo está redirigiendo a la misma vista. De lo contrario, ciertos navegadores (estoy bastante seguro de que FireFox hace esto) terminarán enviando el formulario dos veces.

Aquí está un ejemplo de cómo manejar esto ...

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)) 

Teniendo en cuenta su punto de vista recientemente añadido por encima de ...

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)) 

que utilizará reverse para redirigir a este mismo punto de vista (si eso es lo que estás tratando de hacer)

+1

Spot on, creo. Tuve una corazonada y respondí esto antes de que OP pusiera las vistas. –

+0

Ah, veo que agregó las vistas mientras estaba publicando. Puedo cambiar esto para que coincida. – Brant

+0

No hay necesidad de cambiar, ya lo hice funcionar bien, ¡gracias! – Marijus

1

Lo más probable es: Cuando se actualiza después de enviar el formulario, usted está mostrando la misma página de formulario de nuevo (sin hacer nada). Debe redirigir a la página de registro o a una página nueva después de que se haya enviado el formulario.

De esta manera, el formulario se vacía sus datos y no volverá a enviar cuando actualice.

0

Use HttpResponseRedirect

crear una nueva vista (digamos thank_you) para mostrar correctamente el mensaje después de enviar el formulario y devolver una plantilla.

Después de enviar el formulario con éxito hacer retorno HttpResponseRedirect ("/ de agradecimiento /") a la nueva vista

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)) 

y en urls.py

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

forma múltiple de agradecimiento el envío se produce porque cuando la página actualiza la misma URL, esta llama a esa misma vista una y otra vez y, por lo tanto, se guardan varias entradas en la base de datos. Para evitar esto, estamos obligados a redirigir la respuesta a la nueva url/vista, para que la próxima vez que la página se actualice, llegue a esa nueva URL/vista.

Cuestiones relacionadas