You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中为登录表单添加Google reCAPTCHA v2遇问题求助

解决Django登录表单中reCAPTCHA无法显示的问题

我帮你定位到了代码里的核心问题,再结合几个常见的配置坑,应该能解决验证码不显示的问题:

1. 表单结构错误(最关键)

你在NewUserForm内部嵌套了YourForm,但实际视图里传递给模板的肯定是外层的NewUserForm实例——这个表单根本没有captcha字段!模板里的{{ form.captcha }}自然是空的。

修正方式:把验证码字段直接加到目标表单里,比如如果是注册表单需要验证码,就这么改:

# forms.py
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from captcha.fields import CaptchaField  # 根据你用的库调整字段名,比如django-recaptcha是ReCaptchaField

class NewUserForm(UserCreationForm):
    email = forms.EmailField(required=True)
    captcha = CaptchaField()  # 直接把验证码字段放在这里,不要嵌套内部类

    class Meta:
        model = User
        # 要把captcha加入fields列表,不然表单验证会忽略它
        fields = ("username", "email", "password1", "password2", "captcha")

    def save(self, commit=True):
        user = super(NewUserForm, self).save(commit=False)
        user.email = self.cleaned_data['email']
        if commit:
            user.save()
        return user

# 如果是单独的登录表单,单独定义:
# class LoginForm(forms.Form):
#     username = forms.CharField()
#     password = forms.CharField(widget=forms.PasswordInput)
#     captcha = CaptchaField()

2. 确保视图传递正确的表单实例

检查你的视图函数,确认传递给模板的form变量是包含captcha字段的那个表单对象:

# views.py
from django.shortcuts import render
from .forms import NewUserForm  # 或者你定义的LoginForm

def register(request):
    if request.method == 'POST':
        form = NewUserForm(request.POST)
        if form.is_valid():
            form.save()
            # 后续跳转逻辑
    else:
        form = NewUserForm()
    # 一定要把正确的form实例传给模板
    return render(request, 'login.html', {'form': form})

3. 验证库的基础配置

不管用哪个reCAPTCHA库,都要确保基础配置到位:

  • 已经通过pip安装库(比如pip install django-simple-captcha或django-recaptcha)
  • 在settings.py的INSTALLED_APPS里添加对应app:
    INSTALLED_APPS = [
        # ...其他app
        'captcha',  # django-simple-captcha的配置
        # 若是django-recaptcha则是'recaptcha'
    ]
    
  • 如果是第三方验证码服务(比如Google reCAPTCHA),要在settings.py里配置密钥:
    # django-recaptcha的配置示例
    RECAPTCHA_PUBLIC_KEY = '你的公钥'
    RECAPTCHA_PRIVATE_KEY = '你的私钥'
    
  • 运行过数据库迁移(比如django-simple-captcha需要生成验证码表):
    python manage.py migrate
    

4. 模板调试技巧

如果还是不显示,可以先在模板里渲染整个表单:

<form action="/your-name/" method="post">
    {% csrf_token %}
    {{ form.as_p }}  <!-- 先看整个表单是否包含验证码字段 -->
    <input type="submit" value="Submit">
</form>

如果整个表单能显示验证码,再单独提取{{ form.captcha }};如果还是不行,检查浏览器控制台是否有JS加载错误(比如reCAPTCHA的脚本没加载成功)。

内容的提问来源于stack exchange,提问作者Dev012

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:03:09