2010-01-29 30 views
15

Tengo un formulario django con dos botones de envío diferentes, en la vista donde se envía el formulario Necesito saber qué botón de enviar se presionó y tomar diferentes acciones en consecuencia.Django request.POST no contiene el nombre del botón que envió el formulario

Por lo que he leído, el nombre o id del botón de envío debe estar en algún lugar del diccionario request.POST, pero no está allí.

Este es un fragmento de mi formulario:

<form id="editPaperForm" action="{{paper.editURL}}" method="POST"> 
    <input type="submit" name="savePaperButton" id="savePaperButton" value="Save and Send Later"/> 
    <input type="submit" name="sendPaperButton" id="sendPaperButton" value="Save and send"/> 

    ... 

</form> 

En la vista:

... 
if 'sendPaperButton' in request.POST: 
    return applicants_confirmSend(request, paperID) 
else: 
    return applicants_home(request) 

sendPaperButton nunca está en el request.POST, y tampoco lo es el otro, debo buscar ¿en algún otro lugar?

La única idea que tengo es añadir un campo oculto y modificarlo a través de JavaScript antes de enviar el formulario, pero que parece un poco redundante, ya que estoy bastante seguro de que los datos deben ser un punto intermedio ...

Gracias !

+1

¿Ha intentado ver lo que su navegador envía a través de un depurador de http como Charles o Fiddler? –

+0

No, no lo he hecho, pero me dieron curiosidad sobre lo que el navegador estaba enviando, así que probé con un navegador diferente (estaba usando Firefox 3.5, intenté con Chrome 4 e IE6), resultó que Chrome e IE6 enviaron la identificación y el valor del botón, Firefox no ... ¿adivinar la entrada oculta con el valor agregado de Javascript es mi única opción? –

+0

¿Por qué no usar una casilla de verificación o algún otro elemento de formulario adecuado? –

Respuesta

28

No olvide agregar los parámetros de nombre y valor a los campos "botón" o "tipo de entrada = enviar" del formulario. Tuve el mismo problema una vez y me volví loco.

En resumen, como request.POST contiene un dict, necesita una clave y un valor. La clave corresponde al parámetro del nombre de su botón, y el valor del dict al valor del botón.

<button type="submit" value="preview">Preview</button> 

no se reflejará en request.POST (no hay ninguna clave para el diccionario de la POST!), Mientras que

<button type="submit" value="preview" name="preview">Preview</button> 

tendrá una clave de "vista previa" con "vista previa" de valor.

+0

Esto es exactamente lo que olvidé. ¡Gracias por la pista! – Patrick

+0

Tiene problemas en la última versión de Google Chrome con esto, aunque funciona bien con la última versión de Firefox. – Pat

+0

Esto solucionó un problema similar que tenía cuando los campos de formulario tenían ID únicos y no 'nombre', ¡y el POST no contenía datos! ¡Me estaba volviendo loco! ¡Gracias! – jozzas

0

Por alguna razón, en Chrome, cuando tenía dos botones con las etiquetas <input/>, en realidad trataría el botón que no hice clic como entrada. De esa manera, cuando probé algo como 'sendPaperButton' in request.POST, devolvería lo contrario de lo que quería.

Cambié estas etiquetas a <button></button> y funcionó bien.

Cuestiones relacionadas