urls - Django request.POST no contiene el nombre del botón que envió el formulario
django views (2)
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 envío se presionó y tomar las medidas correspondientes en consecuencia.
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 forma:
<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 request.POST, y tampoco es el otro, ¿debería buscar en otro lugar?
La única idea que tengo es agregar un campo oculto y modificarlo a través de JavaScript antes de enviar el formulario, pero parece algo redundante, ya que estoy bastante seguro de que los datos deberían estar allí en alguna parte ...
¡Gracias!
No olvide agregar los parámetros de nombre y valor a sus 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 POST!), mientras que
<button type="submit" value="preview" name="preview">Preview</button>
tendrá una clave "vista previa" con valor "vista previa".
Por algún motivo, en Chrome, cuando tenía dos botones usando etiquetas <input/>
, en realidad trataría el botón en el que no hice clic como entrada. De esa forma, 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.