2009-01-28 13 views
16

Estoy tratando de crear un campo de formulario personalizado y validarlo. Esta es la versión 1.0 de Django.Django y la validación del formulario personalizado

Aquí es mi forma de objeto

class UsernameField(forms.CharField): 
    def clean(self, values): 
     print "" 

Así es como yo lo llamo

class RegisterForm(forms.Form): 
    username = UsernameField(max_length=30, min_length=4) 
    password = forms.CharField(widget = forms.PasswordInput(), min_length=5) 
    password2 = forms.CharField(widget = forms.PasswordInput(), min_length=5) 
    email = forms.EmailField(max_length=75) 

Ahora quiero mantener los controles por defecto min/MAX_LENGTH para un CharField de la pegajosidad .. pero puedo Parece que no saben cómo hacerlo.

Si coloco un código en limpio() no están marcados. Si intento llamar a parent.clean() recibo un error.

Respuesta

3

que no funcionaron en 1,0 ... aquí es cómo lo resolví

class UsernameField(forms.CharField): 
    def clean(self, request, initial=None): 
     field = super(UsernameField, self).clean(request) 

     from django.contrib.auth.models import User 
     user = User(username=request) 
     if user is not None: 
      raise forms.ValidationError("That username is already taken") 
+3

Solución fina, mala pregunta :-) En ninguna parte de su pregunta usted explicó lo que en realidad estaba tratando de lograr. –

27

Si lo que desea es limpiar el campo, no hay necesidad de definir un nuevo campo, se puede hacer eso en el método clean_username de forma

class RegisterForm(forms.Form): 
    username = forms.CharField(max_length=30, min_length=4) 
    ... 
    ... 

    def clean_username(self): 
    username = self.cleaned_data['username'] 
    try: 
     user = User.objects.get(username=username) 
    except User.DoesNotExist: 
     return username 
    raise forms.ValidationError(u'%s already exists' % username) 

    def clean(self): 
    # Here you'd perform the password check 
    ... 

también puede considerar el uso de django-registration para el registro de usuario en Django, que se encarga de esto en una aplicación enchufable, que se encargará de toda la validación del usuario, creación y configuración para usted.

En cuanto a la nueva creación de firld, el método clean() de su campo debe devolver un valor limpio, no solo imprimirlo.

class MyField(forms.CharField): 
    def clean(self, value): 
    # perform cleaning 
    return value 
Cuestiones relacionadas