Validacion de campos existentes en la base de datos.

1,042 views
Skip to first unread message

Paul Cumba

unread,
May 26, 2012, 1:09:16 PM5/26/12
to djan...@googlegroups.com
Hola amigos.

Acabo de personalizar mis formularios pero necesito tener mis propias reglas de validacion. Cuando utilizaba formularios generado desde  los modelos, Django me realizava la validacion, pero ahora necesito saver como hacer para que me indicque un error al momento de insertar un dato que debe ser unico en la base de datos.

Ejemplo:

class modelo(models.Model)
       campo1.models.CharField(max_length = 10)
       campo2.models.Charfield(max_length = 5, unique = True)

class formulario(forms.Form):
    campo1 = forms.CharField(max_length = 10,widget=forms.TextInput(
                 attrs={'size':'10', 'class':'inputText'}))
    campo2 = forms.CharField(max_length = 5,widget=forms.TextInput(
                 attrs={'size':'5', 'class':'inputText'}))

Compo puedo indicar el mensaje de error en caso de que se quiera ingresar valores al campo2 si estos ya estan repetidos. He leido acerca de raise ValidationError. pero en un ejemplo practico de como lo utilizaria para mi caso seria de mucha ayuda. Gracias de antemano.

Alexis Roda

unread,
May 26, 2012, 2:05:42 PM5/26/12
to djan...@googlegroups.com
Al 26/05/12 19:09, En/na Paul Cumba ha escrit:
En general para validar un campo de un formulario debes definir un
m�todo tipo:

def clean_campo2(self) :
valor = self.cleaned_data["campo2"]
if not alguna_validacion(valor) :
raise ValidationError("Mensaje de error")
return self.cleaned_data

Puedes encontrar m�s informaci�n en:

https://docs.djangoproject.com/en/1.4/ref/forms/validation/

En tu caso, al tratarse de un formulario que opera sobre un modelo puede
que no sea muy buena idea repetir el c�digo de validaci�n en el modelo y
el formulario. Echale un vistazo a:

https://docs.djangoproject.com/en/1.4/ref/models/instances/

para ver como funciona la validaci�n de modelos y como "integrarla" en
tu formulario.





Saludos

Paul Cumba

unread,
May 26, 2012, 2:23:20 PM5/26/12
to djan...@googlegroups.com
Hola Alexis.

Si la documentacion de la validacion a travez del metodo clean es clara, pero como la implementaria al comparar el dato existente en la BD.
No se si es lo correcto pero se me ocurre.

 def clean_campo2(self, valor) :
     valor = self.cleaned_data["campo2"]
     validacion = Modelo.objects.filter(self.campo2 = valor)
     if  validacion:

         raise ValidationError("Mensaje de error")
     return self.cleaned_data

No se si sea lo correcto.!! Sugerencias..

Alexis Roda

unread,
May 26, 2012, 2:48:12 PM5/26/12
to djan...@googlegroups.com
Al 26/05/12 20:23, En/na Paul Cumba ha escrit:
Es muy posible que tu c�digo funcione. Ahora mismo no estoy seguro de
como se eval�a un queryset en un contexto booleano, tiene su l�gica que
si no contiene ning�n registro eval�e a falso, de la misma forma que una
lista vac�a.

Yo suelo utilizar 'exists' para hacerlo mas explicito:

if Modelo.objects.filter(campo2=valor).exists() :
raise ValidationError(....)

https://docs.djangoproject.com/en/1.4/ref/models/querysets/#exists




Saludos

Paul Cumba

unread,
May 26, 2012, 4:22:51 PM5/26/12
to djan...@googlegroups.com
Si tienes razon el queryset se lo debe de utilizar con el exists(), fue un error mio. Pero el metodo clean donde seria logico implementarlo en el modelo o en el formulario..???

Alexis Roda

unread,
May 27, 2012, 7:01:00 AM5/27/12
to djan...@googlegroups.com
Al 26/05/12 22:22, En/na Paul Cumba ha escrit:
> Si tienes razon el queryset se lo debe de utilizar con el exists(), fue
> un error mio.

No dije que fuese un error.

> Pero el metodo clean donde seria logico implementarlo en
> el modelo o en el formulario..???

Yo creo que las validaciones que garantizan la consistencia de los datos
que hay en la base de datos deber�an centralizarse en los modelos. Otra
cosa distinta seria un formulario en el que entras los par�metros de un
informe por ejemplo, al no estar ligado a la creaci�n/modificaci�n de un
modelo las validaciones ir�an en el formulario.

Los ModelForm te facilitan mucho la vida haciendo todo esto y son muy
configurables. Supongo que tendr�s tus motivos para utilizar un Form en
lugar de un ModelForm.

Si utilizas un Form deber�as leer:

https://docs.djangoproject.com/en/1.4/ref/models/instances/

seg�n lo que all� se explica puedes a�adir a tu formulario un m�todo tipo:

# esto es pseudo c�digo, hay que pulir algunos detalles
def clean(self) :
cleaned_data = super(MyForm, self).clean()
modelo = MyModel(**cleaned_data)
try:
modelo.full_clean()
except ValidationError, e:
self.actualizar_errores(e, cleaned_data)
return cleaned_data

La idea es delegar la validaci�n en el modelo y capturar los errores
a�adi�ndolos a la lista de errores de cada campo. El m�todo
"actualizar_errores" es el responsable de asociar los errores del modelo
a errores de campos del formulario y de borrar los �tems de cleaned_data
que no han superado la validaci�n.

Esto viene a ser mas o menos lo que hacen los ModelForm, as� que �por
qu� reinventar la rueda?



Saludos
Reply all
Reply to author
Forward
0 new messages