首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django和自定义表单验证

Django和自定义表单验证
EN

Stack Overflow用户
提问于 2009-01-28 20:44:29
回答 2查看 22.5K关注 0票数 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的默认最小/最大长度检查。但我似乎不知道该怎么做。

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

EN

回答 2

Stack Overflow用户

发布于 2009-01-28 23:59:42

如果只想清理字段,则不需要定义一个全新的字段,可以在表单的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
票数 27
EN

Stack Overflow用户

发布于 2009-01-28 21:11:01

这在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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/489252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档