2012-05-15 20 views
11

Tengo un proyecto de Django que, en una página, tiene múltiples formularios (en etiquetas diferentes) que se pueden enviar para tener diferentes efectos. En todos los casos, deseo que el usuario sea redireccionado a la misma página, por lo que utilizo en mi vista el patrón de enviar el formulario y luego redirigirlo a la página original. En al menos un caso, la única diferencia entre dos de los formularios es el valor del botón de envío.¿Cómo puedo acceder al valor del botón de envío de formulario en Django?

En mi opinión, tengo el código (que es la primera vez que mi función de vista accede al request.POST):

if request.POST['submit']=='Add': 
    #code to deal with the "Add" form 

y en la plantilla, la primera forma tiene un botón de envío como

<input type="submit" value="Add"> 

pensé que esto iba a funcionar, pero cuando me presento esa forma, me da un error en la línea de visión desde arriba:

Clave 'enviar' no se encuentra en <QueryDict: {u'clientyear': [u'2012'], u'csrfmiddlewaretoken': [u'be1f2f051f09f6ab0375fdf76cf6a4d7'], u'ben': [u'123405']}>

Obviamente, esto no tiene un 'submit' tecla o cualquier tecla con el valor correspondiente al botón de enviar hice clic. Entonces, como esto no funciona, ¿cómo se puede acceder al valor del botón de envío o indicar cuál de los formularios se ha enviado?

Respuesta

22

Submit es una estructura de formularios HTML ... Debe utilizar el nombre del atributo de objetos de formulario de la siguiente manera ... En su plantilla:

<form> 
... 
<input type="submit" name="list" value="List Objects" /> 
</form> 
<form> 
... 
<input type="submit" name="do-something-else" value="Do Something Else" /> 
</form> 

En su opinión:

if 'list' in request.POST: 
    # do some listing... 
elif 'do-something-else' in request.POST: 
    # do something else 
+1

Depende de lo que es el valor establecido para la específica botón de envío. Si esta es una cadena vacía, su solución no funcionará (porque '''', una cadena vacía, se evalúa como falsa). – Tadeck

+0

Uso * ... * para mostrar lo importante es 'nombre' no' valor' ... Reparado en este momento, gracias. – FallenAngel

+0

No hay problema. Pero tal vez la forma más fácil es reemplazar 'request.POST.get ('list')' con ''list' en request.POST'? – Tadeck

5

Uno Lo que debe tener en cuenta para evitar confusiones. El name del botón de envío no se mostrará si solo hay un botón en el formulario.

#template.html 
<form action="..." method="post"> 
<input type="submit" name = "first_button" value="Add"> 
</form> 

#view.py 
... 
'first_button' in request.POST #False 

#template.html 
<form action="..." method="post"> 
<input type="submit" name = "first_button" value="Add"> 
<input type="submit" name = "second_button" value="Remove"> 
</form> 

#view.py 
... 
'first_button' in request.POST #True if you clicked on that button 
Cuestiones relacionadas