Как заменить super().save() в моей пользовательской форме регистрации, если recaptcha не подтверждена
Как заменить super().save() в моей пользовательской форме регистрации, если recaptcha не подтверждена
class MyCustomSignupForm(SignupForm):
def save(self, request):
token = request.POST['g-recaptcha-response']
action = "signup"
r_result = recaptcha(request, token, action)
if r_result:
user = super(MyCustomSignupForm, self).save(request)
else:
messages.warning(request, '...robot...')
user = ???
return user
Я думаю, что более простым подходом здесь является выдача ошибки при сбое повторной проверки. Вы можете сделать это с помощью защитного предложения вместо if/else , например:
if not r_result:
raise ValidationError("whatever")
user = super(MyCustomSignupForm, self).save(request)
Я не уверен, что это именно то, что вы искали.
Если капча определила в форме, вы могли бы использовать метод clean_g-recaptcha-response()
для проверки правильности и возврата ошибки.
Если капча добавлена в форму отдельно, вам следует проверить ее с помощью метода clean()
.
При добавлении поля в методы очистки будет возвращена ошибка проверки и отображена в форме.
Вам нужно будет добавить request
из __init__()
, поскольку он используется в функции recaptcha()
.
class MyCustomSignupForm(SignupForm):
def __init__(self, *args, request=None, **kwargs):
super().__init__(*args, **kwargs)
self.request = request
def clean_g_recaptcha_response(self):
token = self.cleaned_data.get('g_recaptcha_response')
action = "signup"
r_result = recaptcha(self.request, token, action)
if not r_result:
raise ValidationError("Captcha Error")
return token
# Or use:
def clean(self):
cleaned_data = super().clean()
token = self.request.POST.get("g-recaptcha-response")
action = "signup"
r_result = recaptcha(self.request, token, action)
if not r_result:
raise ValidationError("Captcha Error")
return cleaned_data
Спасибо Бен. Теперь я успокоил дятла, который продолжал стучать в мою регистрационную форму и создавать ошибку сервера.
Код, который у меня работает
class MyCustomSignupForm(SignupForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.request = kwargs.pop('data', None)
def clean(self):
cleaned_data = super().clean()
token = self.request.get('g-recaptcha-response')
action = "signup"
r_result = recaptcha(token, action)
if not r_result:
raise ValidationError('Are you a robot?')
return cleaned_data
p.s. Добавьте тег в шаблон
{{ form.non_field_errors }}