2010-01-29 7 views
15

Ho un modulo django con due diversi pulsanti di invio, nella vista in cui è stato inviato il modulo Ho bisogno di sapere che pulsante di invio è stato premuto e prendere diverse azioni di conseguenza.Django request.POST non contiene il nome del pulsante che ha inviato il modulo

Da quello che ho letto il nome del pulsante di invio o id dovrebbe essere da qualche parte nella request.POST dizionario, ma non lì!

Questo è un frammento della mia 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> 

Nella vista:

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

sendPaperButton non è mai nel request.POST, e nessuno dei due è l'altro, devo cercare altrove?

L'unica idea che ho è quello di aggiungere un campo nascosto e modificarlo tramite javascript prima di inviare il modulo, ma che sembra tipo di superfluo dato che io sono abbastanza sicuro che i dati dovrebbero essere lì da qualche parte ...

Grazie !

+1

Hai provato a guardare ciò che il tuo browser invia tramite un debugger http come Charles o Fiddler? –

+0

No, non l'ho fatto, ma mi hai incuriosito da ciò che il browser inviava, quindi ho provato un browser diverso (utilizzavo Firefox 3.5, ho provato Chrome 4 e IE6), Chrome e IE6 hanno inviato l'id e il valore del pulsante, Firefox non ... indovina l'input nascosto con il valore aggiunto di Javascript è la mia unica opzione? –

+0

Perché non utilizzare una casella di controllo o qualche altro elemento di forma appropriato? –

risposta

28

Non dimenticare di aggiungere i parametri nome e valore ai campi "pulsante" o "tipo di input = inoltra" del modulo. Ho avuto lo stesso problema una volta e mi ha fatto impazzire.

In breve, come request.POST contiene un dict, è necessario un tasto e un valore. La chiave corrisponde al parametro name del tuo pulsante e il valore del dict al valore del pulsante.

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

non si rifletterà in request.POST (non c'è nessun tasto per il dizionario POST!), Mentre

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

avrà un tasto "anteprima" con il valore "anteprima".

+0

Questo è esattamente quello che ho dimenticato. Grazie per il suggerimento! – Patrick

+0

Problemi con la versione più recente di Google Chrome, anche se funziona perfettamente con l'ultima versione di Firefox. – Pat

+0

Abbiamo risolto un problema analogo in cui i campi del modulo avevano ID univoci e nessun 'nome' e il POST non conteneva dati! Mi stava facendo impazzire! Grazie! – jozzas

0

Per qualche motivo, in Chrome, quando avevo due pulsanti che utilizzavano i tag <input/>, trattava effettivamente il pulsante che non ho fatto clic come input. In questo modo, quando ho provato qualcosa come 'sendPaperButton' in request.POST, sarebbe tornato il contrario di quello che volevo.

Ho cambiato questi tag in <button></button> e ha funzionato bene.