2010-03-12 23 views
6

Al sobrescribir un método de limpieza de formularios, ¿cómo puede saber si su validación falló en alguno de los campos? p.ej. en el siguiente formulario si sobrescribo el método de limpieza, ¿cómo sé si el formulario ha fallado la validación en alguno de los campos?django overwrite form clean method

class PersonForm(forms.Form): 
    title = Forms.CharField(max_length=100) 
    first_name = Forms.CharField(max_length=100) 
    surname = Forms.CharField(max_length=100) 
    password = Forms.CharField(max_length=100) 

def clean(self, value): 
    cleaned_data = self.cleaned_data 

    IF THE FORM HAS FAILED VALIDATION: 
     self.data['password'] = 'abc' 
     raise forms.ValidationError("You have failed validation!") 
    ELSE: 
     return cleaned_data 

Gracias

Respuesta

10

Puede comprobar si los errores se han añadido a la dict error:

def clean(self, value): 
    cleaned_data = self.cleaned_data 

    if self._errors: 
     self.data['password'] = 'abc' 
     raise forms.ValidationError("You have failed validation!") 
    else: 
     return cleaned_data 

PRIMA! Puede comprobar si hay errores en los campos específicos:

def clean(self, value): 
    cleaned_data = self.cleaned_data 

    if self._errors and 'title' in self._errors: 
     raise forms.ValidationError("You call that a title?!") 
    else: 
     return cleaned_data 
+1

Hola Mark Estoy utilizando exactamente este procedimiento, sin embargo, el error de validación se muestra en la parte superior de la página de administración (change_form). ¿Cómo puedo mostrar el mensaje de error justo encima del campo para el que estoy aplicando la validación? Gracias de antemano –

+1

La forma más sencilla de hacer eso es elevar el error de validación dentro del 'clean_ ' para su campo. Ver https://docs.djangoproject.com/en/1.4/ref/forms/validation/ –

+1

Hola Mark He escrito this raise forms.ValidationError ({'interview_type': ["mensaje de error",]}) pero me está mostrando el mensaje de error en la parte superior de change_form. ¿Puedes decir ¿Qué debería modificar en esto? –

4

Si los datos no valida, la instancia La forma no tendrá un cleaned_data atribuyen

Django Doc on Accessing "clean" data

Uso self.is_valid().

+0

modo habría que acabo de hacer una verificación de cleaned_data por ejemplo, si no es self.cleaned_data: #do algo – John

+0

No, el atributo no existe, se obtendría un AttributeError. Extendí mi respuesta. – stefanw

0

Aquí es un ejemplo sencillo de anular clean() en django.forms.Form y también utilizando django-braces para AnonymousRequiredMixin exigir que sólo los usuarios anónimos visitan el Loing Página:

class LoginView(AnonymousRequiredMixin, FormView): 
    """ 
    Main Login. And Social Logins 
    """ 
    template_name = 'core/login.html' 
    form_class = LoginForm 
    success_url = reverse_lazy('blog:index') 

    def get_success_url(self): 
     try: 
      next = self.request.GET['next'] 
     except KeyError: 
      next = self.success_url 
     return next 

    def form_valid(self, form): 
     cd = form.cleaned_data 
     user = auth.authenticate(username=cd['login_username'], 
      password=cd['login_password']) 
     if user: 
      auth.login(self.request, user) 
      messages.info(self.request, 'You are logged in.') 
     return super(LoginView, self).form_valid(form) 
0

Aunque su publicación anterior, si desea aplicar validaciones en más de 1 campo de la misma forma/modelo, use clean(). Este método devuelve clean_data diccionario.

Para mostrar los errores a los usuarios, puede utilizar el método add_error(<fieldname>, "your message"). Esto mostrará los errores junto con el nombre del campo en lugar de la parte superior del formulario. El ejemplo se muestra a continuación:

add_error() elimina automáticamente el campo de clean_data diccionario, no tiene que eliminarlo manualmente. Además, no tienes que importar nada para usar esto.

documentation is here

def clean(self): 

    if self.cleaned_data['password1'] != self.cleaned_data['password2']: 
    msg = 'passwords do not match' 
    self.add_error('password2', msg) 

    return self.cleaned_data 

Si lo que desea es la validación con sencillo en el campo de la utilización formulario/ModelForm clean_<fieldname>(). Este método tomará los valores de clean_data diccionario y luego puede verificar si hay errores lógicos. Siempre devuelva el valor una vez que haya terminado de verificar la lógica.

def clean_password(self): 

    password = self.cleaned_data['password'] 

    if len(password)<6: 
    msg = 'password is too short' 
    self.add_error('password', msg) 

    return password 
Cuestiones relacionadas