Как заменить 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 }}
Вернуться на верх