Ошибка Django: __init__() получил несколько значений для аргумента ключевого слова 'max_length'
Я получаю эту ошибку. Я не понимаю голову и хвост этого.
__init__() got multiple values for keyword argument 'max_length'
,
Я добавляю три поля в UserCreationForm
от django.contrib.auth.forms
, которые email
, first name
а также last 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
Я прочитал эту статью, но это не помогло в моей ситуации.
2 ответа
То, что Даниил предложил выше, должно работать.
first_name = forms.CharField(label=_('first name'), max_length=30, required=True)
Вам также не нужно сохранять first name
а также last_name
в явном виде. Это будет заботиться save function
у вас есть выше. если вы не хотите сделать некоторые cleaning
сами.
Поля формы не являются полями модели: они не принимают позиционный параметр в качестве подробного имени. Вы должны указать это как label
kwarg:
first_name = forms.CharField(label=_('first name'), max_length=30, required=True)