I am trying to create a custom form field and validate off it. This is version 1.0 of Django.
Here is my form object
class UsernameField(forms.CharField):
def clean(self, values):
print ""
Here is how I call it
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)
Now I want to keep the default min/max_length checks for a CharField in tack.. but I can't seem to figure how how to do that.
If I put any code into clean() those are not checked. If i try to call parent.clean() i get an error.
If you just want to clean your field, there's no need to define a whole new field, you can do that in the form's clean_username method
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
...
You might also consider using django-registration for user registration in Django, it takes care of this in a pluggable app, which will handle all the user validation, creation and setup for you.
As for the new firld creation, your field's clean() method should return a cleaned value, not just print it.
class MyField(forms.CharField):
def clean(self, value):
# perform cleaning
return value
That didn't work in 1.0... here is how I solved it
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")
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With