Django和自定义表单验证

16

我正在尝试创建一个自定义表单字段并对其进行验证。使用的是 Django 1.0 版本。

这是我的表单对象:

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)

现在我想保持CharField的默认min/max_length检查,但似乎无法弄清如何实现。

如果我将任何代码放入clean()中,则不进行检查。如果我尝试调用parent.clean(),则会出错。

2个回答

27

如果你只想清理你的字段,没有必要定义一个全新的字段,在表单的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进行用户注册,它是一个可插拔的应用程序,可以处理所有用户验证、创建和设置。

至于新字段创建,您的字段的clean()方法应返回已清理过的值,而不仅仅是打印出来。

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

3

在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
好的解决方案,糟糕的问题 :-) 在你的问题中,你没有解释你实际想要达成什么。 - Carl Meyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接