【问题标题】:Django Error: __init__() got multiple values for keyword argument 'max_length'Django 错误:__init__() 为关键字参数“max_length”获取了多个值
【发布时间】:2014-03-20 19:19:41
【问题描述】:

我收到此错误。我不明白它的头和尾。

__init__() got multiple values for keyword argument 'max_length'.

我正在从django.contrib.auth.formsUserCreationForm 添加三个字段, 它们是emailfirst namelast name,我想将它们保存到我的用户对象中。 (名字和姓氏会自动保存吗)。

这是我正在尝试加载的form

class MyRegistrationForm(UserCreationForm):
    #define fields
    email=forms.EmailField(required=True)
    first_name = forms.CharField(_('first name'), max_length=30, required=True)
    last_name = forms.CharField(_('last name'), max_length=30, required=True)
    helptext={'username':"* must contain only alphabets and numbers",
              'email':"*",
              'password1':"*must contain alphabets in upper and lower case, numbers special char",
              'password2': "*Enter the same password as above, for verification"}

    err_messages={'invalid_username': _("username must include only letters and numbers"),
        'password_length': _("minimum length must be 8 characters"),
        'password_invalid':_("must include special character")}

    def __init__(self, *args, **kwargs):
        super(MyRegistrationForm, self).__init__(*args, **kwargs)
        for fieldname in ['username', 'password1', 'password2','email']:
            self.fields[fieldname].help_text = self.helptext[fieldname]
            self.error_messages.update(self.err_messages)




    class Meta:
        model=User
        fields=('first_name','last_name','username','email','password1','password2')
    #import pdb; pdb.set_trace()    

    def clean_username(self):
        # Since User.username is unique, this check is redundant,
        # but it sets a nicer error message than the ORM. See #13147.
        username = self.cleaned_data["username"]
        if not re.match(r'^\w+$',username):
            raise forms.ValidationError(
            self.error_messages['invalid_username'],
            code='invalid_username',
        )
        return super(MyRegistrationForm, self).clean_username()


    def clean_password2(self):
        password1 = self.cleaned_data.get("password1")
        if len(password1)<8:
            raise forms.ValidationError(
            self.error_messages['password_length'],
            code='password_length',
        )
        if not (re.search(r'[a-z]', password1) and 
                re.search(r'[A-Z]', password1) and
                re.search(r'[^a-zA-Z\d\s:;]',password1)):
            raise forms.ValidationError(
            self.error_messages['password_invalid'],
            code='password_invalid',
        )
        return super(MyRegistrationForm, self).clean_password2()

    def clean_email(self):
            email = self.cleaned_data["email"]
            try:
                user = User.objects.get(email=email)
                print user.email
                print user.username
                raise forms.ValidationError("This email address already exists. Did you forget your password?")
            except User.DoesNotExist:
                return email

    def save(self, commit=True):
            user = super(MyRegistrationForm, self).save(commit=False)
            user.email=self.cleaned_data["email"]
            if commit:
                user.save()
            return user

我已阅读此article,但对我的情况没有帮助。

【问题讨论】:

    标签: django django-forms django-models django-errors


    【解决方案1】:

    表单字段不是模型字段:它们不采用位置参数作为详细名称。您需要将其指定为label kwarg:

    first_name = forms.CharField(label=_('first name'), max_length=30, required=True)
    

    【讨论】:

    • 太棒了。那行得通。但是有一个问题,我是否必须明确保存 first_name 和 last_name 或者超类会处理它?我的意思是在我上面的save() 方法中,应该有user.first_name=..."
    • 可以的。一个小细节..._('first name') 中的下划线我认为它应该被删除...
    【解决方案2】:

    Daniel 上面的建议应该可行。

    first_name = forms.CharField(label=_('first name'), max_length=30, required=True)
    

    您也不需要明确保存first namelast_name。上面的save function 将负责处理。除非你想自己做一些cleaning

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      相关资源
      最近更新 更多