Django 和自定义表单验证

Posted

技术标签:

【中文标题】Django 和自定义表单验证【英文标题】:Django and Custom Form validation 【发布时间】:2010-10-04 02:33:13 【问题描述】:

我正在尝试创建一个自定义表单字段并对其进行验证。这是 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 的默认最小/最大长度检查。但我似乎无法弄清楚如何做到这一点。

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

【问题讨论】:

【参考方案1】:

如果你只是想清理你的字段,没有必要定义一个全新的字段,你可以在表单的 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

【讨论】:

【参考方案2】:

这在 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")

【讨论】:

很好的解决方案,糟糕的问题 :-) 在你的问题中你没有解释你真正想要完成的事情。

以上是关于Django 和自定义表单验证的主要内容,如果未能解决你的问题,请参考以下文章

Django 表单验证之自定义表单验证器

在自定义 Django 表单中验证和显示错误

带有外键的 django 自定义表单验证

如何使用自定义表单和自定义流程

为 django 1.5 自定义用户模型子类化 django-registration 1.0 表单

看用Tornado如何自定义实现表单验证