Форум сайта python.su
Да просто не могу понять, как корректно вставить эту "проверку', когда логин и пароль не подходят. Просто когда без этого конструктора __init__ было, все сообщения об ошибках выдавались. Но то что написал товарищ FishHook, работает, и каптча срабатывает когда число попыток больше нуля. Вопрос, как восстановить так, чтобы еще и на неправильный username или password выводило ошибку.
Пытаюсь модифицировать __init__:
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']) #added if user is None: #added raise forms.ValidationError(u'Имя пользователя и пароль не подходят')#added if ha: self.fields["captcha"] = CaptchaField(label=u'Введите код с картинки:')
Офлайн
Выложите полностью что получилось тяжело по сообщениям собирать.
Офлайн
Кину части отвечающие за данный функционал с моделей форм и контроллеров чтобы было понятно:
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))
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)
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
url(r'^login/$', 'blog.views.log_in', name='log_in'),
Отредактировано Minuteman (Фев. 7, 2014 22:19:49)
Офлайн
Первое , что приходит в глову - а вы ,когда вводите заведомо неверные данные, вводите имя уже зарегистрированного пользователя?
Отредактировано risfio (Фев. 15, 2014 10:58:01)
Офлайн
если ввожу пользователя которого не существует, то приходится делать для него исключение и типа редиректить. если пользователь есть и у него пароль неверный, то выводится каптча(могу и месседж тулить что пароль неверный).
Мне необходимо чтобы при любом варианте выдавало что имя пользователя или пароль неверный и я .. не пихал костыли типа всяких редиректов.
Офлайн