2009-01-28 8 views
16

Ich versuche ein benutzerdefiniertes Formularfeld zu erstellen und validiere es. Dies ist Version 1.0 von Django.Überprüfung von Django und benutzerdefiniertem Formular

Hier ist meine Form Objekt

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

Hier ist, wie ich es nennen

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) 

Jetzt möchte ich für einen CharField in tack die Standard min/max_length Kontrollen halten .. aber ich kann Ich denke nicht, wie man das macht.

Wenn ich einen Code in clean() setzen, werden diese nicht überprüft. Wenn ich parent.clean() aufrufen möchte, erhalte ich einen Fehler.

Antwort

3

, die nicht in 1.0 funktionierte ... hier ist, wie ich es gelöst

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

Feine Lösung, schlechte Frage :-) Nirgends in Ihrer Frage haben Sie erklärt, was Sie tatsächlich versuchten zu erreichen. –

27

Wenn Sie Ihr Feld wollen nur sauber, es gibt keine Notwendigkeit, ein ganz neues Feld zu definieren, die Sie tun können, dass in der clean_username-Methode des Formulars

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

könnten Sie auch erwägen django-registration für die Benutzerregistrierung in Django, es kümmert sich um diese in einer steckbaren App, die für Sie alle Benutzervalidierung, Erstellung und Einrichtung behandelt.

Wie bei der neuen ursprünglichen Erstellung sollte die clean() -Methode Ihres Felds einen bereinigten Wert zurückgeben und nicht nur drucken.

Verwandte Themen