Aha! Сообщение об ошибке проверки, которое вы видите, на самом деле не является сообщением об ошибке проверки. Позволь мне объяснить. Когда вы визуализируете экземпляр формы модели, используя as_p
, каждое поле отображается следующим образом:
<p><label ...>fieldname</label> <input ... name="fieldname" /> HELP TEXT IF ANY</p>
Строка Required. 30 characters or fewer. Letters, numbers and @/./+/-/_ characters
, которую вы видите с правой стороны поля, является не чем иным, как текстом справки. Этот текст справки взят из определения модели - это можно проверить, посетив django/contrib/auth/models.py
и проверив определение класса User
.
При переопределении поля username
вы пропускаете любой текст справки. Естественно "ошибка" исчезает.
Чтобы проверить эту теорию, выполните в своем методе main
следующее.
def main(request):
uf = forms.UserForm()
upf = forms.UserProfileForm()
print "User form is bound:%s errors:%s" % (uf.is_bound, uf.errors)
return render_to_response("authentication/index.html", {'form1': uf, 'form2':upf})
Обновление
if self.cleaned_data['cpassword']!=self.cleaned_data['password']:
Эта строка может вызвать проблемы, когда пользователь не вводит один или оба из password
и cpassword
. Например, попробуйте это из оболочки Django:
>>> data = dict(username = 'admin', cpassword = 'foo', email='admin@bar.com')
>>> f = RegisterForm(data)
>>> f.is_bound
True
>>> f.is_valid()
Traceback (most recent call last):
...
File "<pyshell#2>", line 8, in clean
if self.cleaned_data['cpassword']!=self.cleaned_data['password']:
KeyError: 'password'
Измените метод clean
вашей формы, чтобы убедиться, что оба значения присутствуют перед сравнением. Примерно так:
def clean(self):
password = self.cleaned_data.get('password', None)
cpassword = self.cleaned_data.get('cpassword', None)
if password and cpassword and (password == cpassword):
return self.cleaned_data
else:
raise forms.ValidationError("Passwords don't match")