Реализация django-recaptcha в проекте Django с пользовательским пользователем и django-allauth

Мне нужна помощь в реализации django-recapcha в проекте Django, который имеет пользовательского пользователя, а также django-allauth.

Когда я впервые создавал этот проект, я установил пользовательского пользователя, поскольку это рекомендация с официального сайта Django.(https://docs.djangoproject.com/en/4.0/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project).

После этого я внедрил django-allauth для аутентификации.

Теперь я хочу реализовать django-recapctha и не нашел правильного способа сделать это. Я не знаю, как я должен настроить файл forms.py, потому что я не очень хорошо понимаю, что происходит с этой комбинацией пользовательского пользователя и django-allauth. Какую форму я должен отредактировать для настройки django-recapcha и из какого приложения?

Когда я настраивал пользовательского пользователя, я делал это следующим образом:

Я создал приложение под названием "Счета".

Я создал файл accounts/models.py со следующим кодом:

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    profile_pic = models.ImageField(default='default.jpg', upload_to='profile_pics')

Я создал accounts/forms.py со следующим кодом:

from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm, UserChangeForm


class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = get_user_model()
        fields = (
            'email',
            'username',
        )


class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = get_user_model()
        fields = (
            'email',
            'username',
        )

Затем я добавил следующее в settings.py:

AUTH_USER_MODEL = 'accounts.CustomUser'

В инструкции django-recaptcha указано, что мне нужно добавить ReCaptchaField в форму:

Инструкции на https://pypi.org/project/django-recaptcha/#installation

from django import forms
from captcha.fields import ReCaptchaField

class FormWithCaptcha(forms.Form):
    captcha = ReCaptchaField()

Но я не знаю, в какой части проекта я должен это сделать. Я не знаю, правильно ли это сделать в файле forms.py приложения accounts, где я определил CustomUserCreationForm, или я должен переопределить форму django-allauth Signup? И если это так, то где я это сделаю? В приложении accounts, где я настроил пользовательскую модель пользователя или в другом месте?

Я буду очень признателен за любую помощь или рекомендации о том, как двигаться дальше в этом вопросе.

На данный момент решение этого вопроса следующее, по крайней мере, кажется, что оно работает сейчас.

Переопределите форму Signup в django-allauth для включения поля captcha и реализуйте django-recaptcha.

accounts/form.py

from allauth.account.forms import SignupForm
from captcha.fields import ReCaptchaField
from captcha.widgets import ReCaptchaV2Checkbox

class CustomSignupForm(SignupForm):

    captcha = ReCaptchaField(widget=ReCaptchaV2Checkbox())

    def save(self, request):

        user = super(CustomSignupForm, self).save(request)

        return user

settings.py:

INSTALLED_APPS = [
    ...
    'captcha',
    ...
]

ACCOUNT_FORMS = {'signup': 'accounts.forms.CustomSignupForm'}

RECAPTCHA_PUBLIC_KEY = 'site key'
RECAPTCHA_PRIVATE_KEY = 'private key'

SILENCED_SYSTEM_CHECKS = ['captcha.recaptcha_test_key_error']

signup.html:

{{ form.captcha.errors }}
{{ form.captcha }}
Вернуться на верх