Django和自定义表单验证

问题描述:

我想创建一个自定义表单域并验证它。这是Django的1.0版本。Django和自定义表单验证

这里是我的表单对象

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

这是我如何把它

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) 

现在我想保持默认的最小/ MAX_LENGTH检查在粘性一个CharField ..但我可以似乎没有想到如何做到这一点。

如果我把任何代码放到clean()中,那些不会被检查。如果我尝试调用parent.clean()我得到一个错误。

这并没有在1.0的工作...这里是我如何解决它

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

很好的解决方案,坏的问题:-)在你的问题中没有任何地方能解释你实际上想要完成的事情。 – 2009-01-29 20:03:29

如果你只是想清理你的领域,有没有需要定义一个全新的领域,你可以这样做在窗体的clean_username方法

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

您也可以考虑在Django使用django-registration用于用户注册,它需要护理的这种可插拔的应用程序,这将处理所有的用户验证,创建和设置你。

至于新的firld创建,你的字段的clean()方法应该返回一个已清除的值,而不仅仅是打印它。

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