Реализация 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 }}