formularios form fields example cleaned_data avanzados python django forms formset cleaned-data

python - fields - Cómo acceder a los datos cuando form.is_valid() es falso



django model form (7)

Estaba luchando con un problema similar y encontré una gran discusión aquí: https://code.djangoproject.com/ticket/10427

No está del todo bien documentado, pero para un formulario en vivo, puede ver el valor de un campo, tal como lo ven los widgets / usuarios, con lo siguiente:

form_name[''field_name''].value()

Cuando tengo un formulario válido de Django, puedo acceder a los datos con form.cleaned_data. Pero ¿cómo puedo obtener los datos que ingresó un usuario cuando el formulario no es válido, es decir, form.is_valid es falso?

Estoy intentando acceder a los formularios dentro de un conjunto de formularios, por lo que form.data parece darme un lío.


Me encontré con un problema similar al usar un formset. En mi ejemplo, quería que el usuario seleccionara una primera opción antes de una segunda opción, pero si la primera opción golpeaba otro error, también se mostraba el error "seleccionar la primera opción antes del segundo".

Para tomar los datos sin limpiar del primer campo, los usé dentro del método de limpieza del campo de formulario:

dirty_rc1 = self.data[self.prefix + ''-reg_choice_1'']

Entonces, podría probar la presencia de datos en ese campo:

if not dirty_rc1: raise ValidationError(''Make a first choice before second'')

¡Espero que esto ayude!


Puedes usar

form.data[''field_name'']

De esta forma, obtienes el valor bruto asignado al campo.


Puedes usar este patrón:

class MyForm(forms.Form): ... def clean(self): self.saved_data=self.cleaned_data return self.cleaned_data

En tu código:

if form.is_valid(): form.save() return django.http.HttpResponseRedirect(...) if form.is_bound: form.saved_data[''....''] # cleaned_data does not exist any more, but saved_data does.

Usar form.data no es una buena solución. Razones:

  • Si el formulario tiene un prefijo, las claves del diccionario estarán prefijadas con este prefijo.
  • Los datos en form.data no se limpian: solo hay valores de cadena.

Tengo muchos métodos. Todo lo que puedes elegir

Supongo que la forma es como la siguiente:

class SignupForm(forms.Form): email = forms.CharField(label=''email'') password = forms.CharField(label=''password'', widget=forms.PasswordInput)

1-1. Obtener de la request

def signup(req): if req.method == ''POST'': email = req.POST.get(''email'', '''') password = req.POST.get(''password'', '''')

2-1. Obtenga el raw value asignado al campo y devuelva el valor del atributo de data del campo

def signup(req): if req.method == ''POST'': ... sf = SignupForm(req.POST) email = sf["email"].data password = sf["password"].data ...

2-2. Obtenga el valor bruto asignado al campo y devuelva el valor del atributo de value del campo

def signup(req): if req.method == ''POST'': ... sf = SignupForm(req.POST) email = sf["email"].value() password = sf["password"].value() ...

2-3. Obtener el dictionary asignado a los campos

def signup(req): if req.method == ''POST'': ... sf = SignupForm(req.POST) # print sf.data # <QueryDict: {u''csrfmiddlewaretoken'': [u''U0M9skekfcZiyk0DhlLVV1HssoLD6SGv''], u''password'': [u''''], u''email'': [u''hello'']}> email = sf.data.get("email", '''') password = sf.data.get("password", '''') ...


Usted accede a los datos del método clean () del campo o del método clean () del formulario. clean () es la función que determina si el formulario es válido o no. Se llama cuando se llama is_valid (). En clean () de cleaned_data tiene la lista de cleaned_data cuando puede ejecutar un código personalizado para asegurarse de que todo esté desprotegido. En el widget, también tiene un clean (), pero usa una sola variable pasada. Para acceder al método clean () del campo, tendrás que subclasificarlo. p.ej:

class BlankIntField(forms.IntegerField): def clean(self, value): if not value: value = 0 return int(value)

Si quiere un IntField que no se ahogue en un valor vacío, por ejemplo, usaría lo anterior.

clean () en un tipo de formulario funciona así:

def clean(self): if self.cleaned_data.get(''total'',-1) <= 0.0: raise forms.ValidationError("''Total must be positive") return self.cleaned_data

También puede tener una función clean_FIELD () para cada campo para que pueda validar cada campo individualmente (después de que se llame al clean () del campo)


Ver http://docs.djangoproject.com/en/dev/ref/forms/validation/#ref-forms-validation

En segundo lugar, una vez que hemos decidido que los datos combinados en los dos campos que consideramos no son válidos, debemos recordar eliminarlos de los datos limpios.

De hecho, Django borrará completamente el diccionario clean_data si hay algún error en el formulario. Sin embargo, este comportamiento puede cambiar en el futuro, por lo que no es una mala idea limpiarlo en primer lugar.

Los datos originales siempre están disponibles en request.POST .

Un comentario sugiere que el objetivo es hacer algo que suene como una validación de campo más sofisticada.

Cada campo recibe los datos no validados y devuelve los datos válidos o genera una excepción.

En cada campo, cualquier tipo de validación se puede hacer en los contenidos originales.