【问题标题】:Django and Custom Form validationDjango 和自定义表单验证
【发布时间】: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() 我会得到一个错误。

【问题讨论】:

    标签: django forms validation


    【解决方案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")
      

      【讨论】:

      • 很好的解决方案,糟糕的问题 :-) 在你的问题中你没有解释你真正想要完成的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2018-02-08
      • 2021-06-22
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多