Кину части отвечающие за данный функционал с моделей форм и контроллеров чтобы было понятно:
views.py:
def log_in(request):
if request.method == 'POST':
try:
id_ = User.objects.get(username=request.POST["username"]).pk
profile = UserProfile.objects.get(id = id_)
form = LoginForm(request.POST, hacking_attempts=profile.hacking_attempts)
except User.DoesNotExist:
return HttpResponseRedirect('/login')
#Ранее просто пытался вычислить id_ = User.objects.get(username=request.POST["username"]).pk без всяких try ...excerpt
if form.is_valid():
if form.get_user():
profile.hacking_attempts = 0
profile.save()
login(request, form.get_user())
return HttpResponseRedirect('/profile')
else:
profile.hacking_attempts += 1
profile.save()
form = LoginForm(request.POST, hacking_attempts=profile.hacking_attempts)
else:
form = LoginForm()
return render_to_response('enter.html', {'form': form}, context_instance=RequestContext(request))
models.py:
GENDER_CHOICES = (('m', 'Male'), ('f', 'Female'))
class UserProfile(models.Model):
user = models.OneToOneField(User)
#location = models.CharField(max_length=100)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
hacking_attempts = models.IntegerField(max_length=20, default=0)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
post_save.connect(create_user_profile, sender=User)
forms.py:
class LoginForm(forms.Form):
username = forms.CharField(label=u'Имя пользователя')
password = forms.CharField(label=u'Пароль', widget=forms.PasswordInput)
#captcha = CaptchaField(label=u'Введите код с картинки:')
def __init__(self, *args, **kwargs):
ha = None
if "hacking_attempts" in kwargs:
ha = kwargs.pop("hacking_attempts")
cleaned_data = super(LoginForm, self).__init__(*args, **kwargs)
#user = authenticate(username=cleaned_data['username'], password=cleaned_data['password'])
#if user is None:
# raise forms.ValidationError(u'Имя пользователя и пароль не подходят')
if ha:
self.fields["captcha"] = CaptchaField(label=u'Введите код с картинки:')
def clean(self):
cleaned_data = super(LoginForm, self).clean()
if not self.errors:
user = authenticate(username=cleaned_data['username'], password=cleaned_data['password'])
if user is None:
raise forms.ValidationError(u'Имя пользователя и пароль не подходят')
self.user = user
return cleaned_data
def get_user(self):
return self.user or None
и вот urls.py:
url(r'^login/$', 'blog.views.log_in', name='log_in'),
То есть получается все работает, но в forms.py то что написано в методе clean не выдает ошибочные сообщения когда логин или пароль неверны.