2009-01-28 16 views
16

Sto provando a creare un campo modulo personalizzato e convalidarlo. Questa è la versione 1.0 di Django.Convalida modulo Django e personalizzato

Qui è la mia forma oggetto

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

Ecco come lo chiamo io

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) 

Ora voglio mantenere i controlli di default min/MAX_LENGTH per un CharField in virata .. ma posso sembra come capire come farlo.

Se inserisco un codice pulito(), questi non vengono controllati. Se provo a chiamare parent.clean() ottengo un errore.

risposta

3

che non ha funzionato in 1.0 ... ecco come ho risolto

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

Soluzione fine, brutta domanda :-) Da nessuna parte nella tua domanda hai spiegato cosa stavi effettivamente cercando di realizzare. –

27

Se si desidera solo per pulire il campo, non c'è bisogno di definire un campo completamente nuovo, si può fare nel metodo clean_username del form

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 
    ... 

si potrebbe anche considerare l'utilizzo di django-registration per la registrazione dell'utente in Django, si prende cura di questo in un app pluggable, che gestirà tutta la convalida degli utenti, la creazione e la configurazione per voi.

Per quanto riguarda la nuova creazione di firld, il metodo clean() del campo deve restituire un valore pulito, non solo stamparlo.

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