Is there any solutions to add captcha to Django-allauth?
I too needed to do this with django-allauth and found that implementing the django-recaptcha package to be relatively simple.
Configure django-recaptcha
Sign up for a recaptcha account.
Plug your settings in
# settings.py
RECAPTCHA_PUBLIC_KEY = 'xyz'
RECAPTCHA_PRIVATE_KEY = 'xyz'
RECAPTCHA_USE_SSL = True # Defaults to False
Customize SignupForm
After installing django-recaptcha, I followed someguidelines for customizing the SignupForm.
from django import forms
from captcha.fields import ReCaptchaField
class AllAuthSignupForm(forms.Form):
captcha = ReCaptchaField()
def save(self, request, user):
user = super(AllAuthSignupForm, self).save(request)
return user
You also need to tell allauth to inherit from this form in settings.py
ACCOUNT_SIGNUP_FORM_CLASS = 'myapp.forms.AllAuthSignupForm'
Wire up signup form template
{{ form.captcha }}
and {{ form.captcha.errors }}
should be available on the signup template context at this point.
That was it! Seems like all the validation logic is tucked into the ReCaptchaField
.
To get the ReCaptcha field to the bottom of the form, simply add the other fields before the captcha field.
So what was user, email, captcha, password1, password2
becomes user, email, password1, password2, captcha
with this form:
from allauth.account.forms import SignupForm, PasswordField
from django.utils.translation import ugettext_lazy as _
from captcha.fields import ReCaptchaField
class UpdatedSignUpForm(SignupForm):
password1 = PasswordField(label=_("Password"))
password2 = PasswordField(label=_("Password (again)"))
captcha = ReCaptchaField()
def save(self, request):
user = super(UpdatedSignUpForm, self).save(request)
return user
You then just need to add this form into the settings.py
file as described in the previous answer.