Redireccionar errores de validacion

388 views
Skip to first unread message

Paul Cumba

unread,
May 26, 2012, 5:59:13 PM5/26/12
to djan...@googlegroups.com
Hola a Todos

Despues de realizar mis propias validaciones creando los metodos clean:

def clean_amie(self):
            valor = self.cleaned_data['codigo_amie']
            if Institucion.objects.filter(codigo_amie = valor).exists():
                raise forms.ValidationError(self.error_messages['Institucion con ese codigo AMIE ya existe'])
            return valor

Me retorna el error pero me lo dirije a una pagina de error 500 de Django como redirecciono el error al formulario del cual proviene.

Alexis Roda

unread,
May 27, 2012, 7:13:29 AM5/27/12
to djan...@googlegroups.com
Al 26/05/12 23:59, En/na Paul Cumba ha escrit:
Si te redirige a 500 es que hay un error de programaci�n, ya sea
sint�ctico o l�gico.

Adjunta el traceback (en modo texto) del error.

Puestos a especular dir�a que el error est� en el "self.error_messages".
"error_messages" es un atributo de cada campo, creo que no del
formulario. Prueba con:

raise forms.ValidationError("bla bla bla")



Saludos

Paul Cumba

unread,
May 28, 2012, 12:29:51 AM5/28/12
to djan...@googlegroups.com
Hola Alexis. 

Sabes que si estoy enviando el error con 

raise forms.ValidationError("")

pero no se que estoy haciendo mal porq utilizao el mismo metodo de validacion en otro ingreso y si me funciona. el metodo esta detallado en el primer mensaje que envie pero continua saliendo el error que envio en una pagina 500, mas no en el formulario que deseo que se muestre. te adjunto como se muestre el error.

Imágenes integradas 1
image.jpeg

Alexis Roda Villalonga

unread,
May 28, 2012, 3:27:13 AM5/28/12
to djan...@googlegroups.com


2012/5/28 Paul Cumba <pauld...@gmail.com>
Si no lo veo no lo creo :). Al validar un formulario django "envuelve" la validación de cada campo (clean_xxxx) en un try: ... except ValidationError, e de forma que la excepción que lanza tu método debería ser capturada y no propagada.

    def _clean_fields(self):
        for name, field in self.fields.items():
            # value_from_datadict() gets the data from the data dictionaries.
            # Each widget type knows how to retrieve its own data, because some
            # widgets split data over several HTML fields.
            value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
            try:
                if isinstance(field, FileField):
                    initial = self.initial.get(name, field.initial)
                    value = field.clean(value, initial)
                else:
                    value = field.clean(value)
                self.cleaned_data[name] = value
                if hasattr(self, 'clean_%s' % name):
                    # aqui se llama al clean_xxxxx
                    value = getattr(self, 'clean_%s' % name)()
                    self.cleaned_data[name] = value
            except ValidationError, e:
                self._errors[name] = self.error_class(e.messages)
                if name in self.cleaned_data:
                    del self.cleaned_data[name]

Sin ver el código lo único que puedo decirte es que no deberia pasar.

Otra cosa, en el ejemplo que mande hay un error, clean_xxxx debe devolver el valor del campo, no el valor de cleaned_data.



Saludos

Paul Cumba

unread,
May 28, 2012, 1:28:13 PM5/28/12
to djan...@googlegroups.com
Hola Alexis, gracias por tu pronnta rspuesta.

Bueno la verda no se cual es la razon del porque no me captura el error. Este es el codigo espero puedas ayudarme.

El modelo.

class Institucion(models.Model):
    codigo_amie = models.CharField(max_length = 8, unique = True)
    nombre = models.CharField(max_length = 50)
    canton = models.CharField(max_length = 30)
    parroquia = models.CharField(max_length = 30)
    comunidad = models.CharField(max_length = 30, blank = True)
    nivel = models.CharField(max_length = 50)

El formulario.

class InstitucionForm(forms.Form):
        codigo_amie = forms.CharField(max_length = 8, label = 'Codigo Amie(*)',widget=forms.TextInput(
                 attrs={'size':'10', 'class':'inputText'}))
        nombre = forms.CharField(max_length = 100, label = 'Nombre Institucion(*)',widget=forms.TextInput(
                 attrs={'size':'50', 'class':'inputText'}))
        canton = forms.ModelChoiceField(queryset = Canton.objects.all(),label = 'Canton(*)')
        parroquia = forms.ModelChoiceField(queryset = Parroquia.objects.all(),label = 'Parroquia(*)')
        comunidad = forms.CharField(max_length = 100, required = False, label = 'Comunidad')
        nivel = forms.CharField(max_length=50,
                widget=forms.Select(choices=TITLE_CHOICES))
       
        def clean_amie(self): #METODO DE VALIDACION DE CAMPOS EXISTENTES

            valor = self.cleaned_data['codigo_amie']
            if Institucion.objects.filter(codigo_amie = valor).exists():
                raise forms.ValidationError('Institucion con ese codigo AMIE ya existe')
            return valor

la vista:

@login_required
def ingreso_instituciones(request):
    now = datetime.now().date()
    form = InstitucionForm(request.POST or None)   
    if request.POST and form.is_valid():
        institucion = Institucion()
        institucion.codigo_amie = form.clean_amie() # VALIDACION DEL CAMPO EN EN FORMULARIO.
        institucion.nombre = form.cleaned_data['nombre']
        institucion.canton = form.cleaned_data['canton']
        institucion.parroquia = form.cleaned_data['parroquia']
        institucion.comunidad = form.cleaned_data['comunidad']
        institucion.nivel = form.cleaned_data['nivel']
        institucion.save()
        return HttpResponseRedirect('/gracias/')
    return render_to_response('add_inst.html',{'form':form},context_instance=RequestContext(request))

y la plantilla.

<form class="ingresar" action="" method="POST">
                <table width="100%" cellspacing="2" cellpadding="2" border="0" bgcolor="#E6E6E6">
                <th colspan="2" bgcolor="#D8D8D8"><font color="#2E2E2E">Por favor, Ingrese los datos de la Institución </font></th>
                <tr>
                <td colspan="2" bgcolor="#D8D8D8" align="center"><b>Campos obligatorios(*)</td>
                </tr>
                      {{form.as_table}}
                </table>
                <p><input type="submit" value="Guardar"></p>  
            </form>

Alexis Roda

unread,
May 28, 2012, 2:03:05 PM5/28/12
to djan...@googlegroups.com
Al 28/05/12 19:28, En/na Paul Cumba ha escrit:
> Hola Alexis, gracias por tu pronnta rspuesta.
>
> Bueno la verda no se cual es la razon del porque no me captura el error.
> Este es el codigo espero puedas ayudarme.

>
> la vista:
>
> @login_required
> def ingreso_instituciones(request):
> now = datetime.now().date()
> form = InstitucionForm(request.POST or None)
> if request.POST and form.is_valid():
> institucion = Institucion()
> institucion.codigo_amie = form.clean_amie() # VALIDACION DEL
> CAMPO EN EN FORMULARIO.

El problema est� aqu�, llamas a "clean_amie" fuera de un try: except:,
con lo que la excepci�n, cuando se produce, se propaga y genera el error
500.

De todas formas no es necesario llamar expl�citamente a "clean_amie".
Cuando llamas a "is_valid" este dispara toda la maquinaria de validaci�n
del formulario, incluida la llamada a "clean_amie".



Saludos

Paul Cumba

unread,
May 28, 2012, 3:03:26 PM5/28/12
to djan...@googlegroups.com
La verdad no se que estoy haciendo mal, no me captura la excepcion del error, ya lo encapsulo en un try: except y no me sale.

@login_required
def ingreso_especialidades(request):
    form = EspecialidadForm(request.POST or None)  
    if request.POST and form.is_valid():
        try:
            esp = Especialidad()
            esp.nombre = form.clean_especialidad()
            esp.save()
            return HttpResponseRedirect('/gracias/')
        except:
            raise ValidationError('error')

ahora se me propaga en la pagina 500 el mensaje 'error'

y el form.is_valid no me dispara el metodo clean no se que hago mal.


Alberto Chamorro

unread,
May 28, 2012, 3:09:28 PM5/28/12
to djan...@googlegroups.com

Lo que estas haciendo es capturarla para luego lanzar tu una del tipo ValidationError con raise.

Cambia esa linea por un print "error"

Enviado desde mi Galaxy Nexus @ach4m0

--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.

Paul Cumba

unread,
May 28, 2012, 3:24:49 PM5/28/12
to djan...@googlegroups.com
El 28 de mayo de 2012 14:09, Alberto Chamorro <a.chamo...@gmail.com> escribió:

Lo que estas haciendo es capturarla para luego lanzar tu una del tipo ValidationError con raise.

Cambia esa linea por un print "error"



Hola Alberto.

Ya cambie la linea como me lo sugieres, el resultado es que no tengo ningun resultado, se recarca nuevamete la pagina pero no me muestra el error.

Alberto Chamorro

unread,
May 28, 2012, 3:27:08 PM5/28/12
to djan...@googlegroups.com

Correcto, era para que vieras lo que estabas haciendo. En teoria tendrias que hacer otro HttpResponse mostrando el error si es lo que quieres o redirigiendo a una plantilla de error. La verdad que no se lo que quieres hacer

Enviado desde mi Galaxy Nexus @ach4m0

Alexis Roda

unread,
May 28, 2012, 3:32:46 PM5/28/12
to djan...@googlegroups.com
Al 28/05/12 21:03, En/na Paul Cumba ha escrit:
No tiene sentido: form.is_valid() accede a "errors", una property que
llama a "full_clean()", que a su vez llama a "_clean_fields()" que llama
a "clean_xxxx()".

El problema es que no hay ning�n campo que se llame "amie" y por eso
"clean_amie" no se ejecuta. Renombra el m�todo como "clean_codigo_amie"
y vuelve a probar.

Elimina el try/except, no es necesario y un "except" sin excepci�n es
una fuente segura de problemas a la hora de depurar errores!!!



Saludos

Paul Cumba

unread,
May 28, 2012, 3:46:50 PM5/28/12
to djan...@googlegroups.com

Saben que es muy extraño porq tengo el mismo metodo implementado en el ingreso de un docente, al ingresar el docente me valida la existencia de una cedula y funciona muy bien y al implementarlos en el ingreso de una institucion o una especialidad el error se me propaga a una pag 500. No se porq no funciona pero tratare otras opciones Gracias por su Ayuda.

Paul Cumba

unread,
May 28, 2012, 5:40:31 PM5/28/12
to djan...@googlegroups.com
Quiero comentarles que no pude solucionar esos problemas que tuve al tratar de mostrar la validacion de los formularios, asi que lo que hice fue utilizar la sugerencia de Alberto y envie los mensajes de error por un HttpResponseRedirect por medio de javascript.
Reply all
Reply to author
Forward
0 new messages