2011-11-30 13 views
8

tengo este formulario:Campo oculto en forma de Django no en 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'] 

En la vista Simplemente estoy llamando

if form.is_valid(): 

me sale el error:

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

Según Firebug, el valor está publicando, simplemente no parece estar llegando a mi función limpia. ¿Lo estoy haciendo mal?

EDITAR: Enviar datos

canvas 1 
csrfmiddlewaretoken 2cb73be791b32ca9a41566082c804312 
user username 

Edit2: Yo también estaría dispuesto a tomar una respuesta que me podría decir cómo enviar la clave principal para la función clean_user, donde la clave principal es el/1/en el ejemplo url anterior. La función de la vista que se llama es:

def canvas_add_collaborator(request, pk): 

Así que me quiera enviar el pk a la función clean_user que solucionaría mi problema al no tener el campo oculto.

+0

¿puede agregar el contenido de su publicación http? –

+0

sobre EDIT2. Puede pasar pk a la función clean_user. 'clean_user (self, pk)' –

Respuesta

9

es necesario cambiar el nombre del método para limpiar(), no clean_user(). 'canvas' no está en los datos limpios si solo está validando el campo de usuario.

+0

No sé cómo no hizo clic, tiene mucho sentido. Gracias. – Samsquanch

+0

¿Es posible tener el método clean() de trabajo? – Erwan

0

he resuelto mi problema (probablemente no es la mejor manera, pero funciona) usando la siguiente:

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

Luego, en mi punto de vista:

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

Quizás no sea la solución más elegante, pero funciona por ahora. Comentarios bienvenidos.

+1

Mira mi respuesta. Necesita cambiar el nombre de su función de limpieza. –

0

Encontré que el orden en la declaración de campos importa, por lo que si desea acceder a clean_data ['canvas'] en el método clean_user, debe declarar lienzo primero en sus campos. He probado esto en los formularios del modelo