2011-11-30 10 views
8

ho questo modulo:campo Hidden in forma Django non in cleaned_data

class CollaboratorForm(forms.Form): 
    user = forms.CharField(label="Username",max_length=100) 
    canvas = forms.IntegerField(widget=forms.HiddenInput) 
    .... 
    def clean_user(self): 
     user = self.cleaned_data['user'] 
     canvas = self.cleaned_data['canvas'] 

Nella vista sto semplicemente chiamando

if form.is_valid(): 

ottengo l'errore:

KeyError at /canvas/1/add-collaborator/ 
'canvas' 

Secondo Firebug, il valore è in fase di pubblicazione, ma sembra che non lo stia facendo alla mia funzione pulita. Sto sbagliando?

EDIT: i dati sul post

canvas 1 
csrfmiddlewaretoken 2cb73be791b32ca9a41566082c804312 
user username 

EDIT2: Vorrei anche essere disposto a prendere una risposta che potrebbe dirmi come inviare la chiave primaria per la funzione clean_user, dove la chiave primaria è l'/ 1/nell'URL di esempio sopra. La funzione nella vista che si chiama è:

def canvas_add_collaborator(request, pk): 

Quindi vorrei inviare il pk alla funzione clean_user che risolverebbe il mio problema da non aver bisogno il campo nascosto.

+0

puoi aggiungere il contenuto del tuo post http? –

+0

su EDIT2. Puoi passare pk alla funzione clean_user. 'clean_user (self, pk)' –

risposta

9

È necessario modificare il nome del metodo in clean(), non clean_user(). 'canvas' non è in clean_data se stai solo validando il campo dell'utente.

+0

Non so come non sia stato fatto clic, ha perfettamente senso. Grazie. – Samsquanch

+0

È possibile avere il metodo clean() funzionante? – Erwan

0

ho risolto il mio problema (probabilmente non è il modo migliore, ma funziona) utilizzando questo:

class CollaboratorForm(forms.Form): 
    .... 
    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('canvas', None) 
     super(CollaboratorForm, self).__init__(*args, **kwargs) 

Poi a mio avviso:

def canvas_add_collaborator(request, pk): 
    .... 
    form.canvas = pk 

Forse non la soluzione più elegante, ma funziona per adesso. Feedback benvenuto

+1

Guarda la mia risposta. Devi rinominare la tua funzione pulita. –

0

Ho trovato che l'ordine nella dichiarazione dei campi è importante, quindi se si desidera accedere a clean_data ['canvas'] nel metodo clean_user, è necessario dichiarare prima il canvas nei propri campi. Ho provato questo in Moduli di modello

Problemi correlati