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

Django-Simple-Captcha不生效,验证码错误时仍可成功提交帖子如何解决?

问题根源

你当前的视图代码存在逻辑分离问题,直接导致验证码校验完全不生效:

  • 代码对POST请求做了两次独立判断,验证码校验逻辑和表单提交逻辑没有关联,即使验证码校验失败,后续的表单保存流程依然会正常执行
  • 验证码校验通过后设置的human变量没有被任何逻辑引用,没有作为表单保存的前置校验条件
  • 非POST请求的else分支存在对captcha变量的重复赋值,属于冗余代码
修复后的代码

将两次POST判断合并,把验证码校验作为表单提交的前置条件即可:

def discussions(request):
    posts = Post.objects.filter(created__lte=timezone.now()).order_by('-created')

    if request.method == 'POST':
        captcha = CaptchaTestModelForm(request.POST)
        form = PostForm(request.POST, request.FILES)
        # 同时校验验证码和表单有效性,验证码通过才允许保存帖子
        if captcha.is_valid() and form.is_valid():
            post = form.save(commit=False)
            post.created = timezone.now()
            post.save()
            return redirect('discussions')
    else:
        captcha = CaptchaTestModelForm()
        form = PostForm()
    
    # 请补充你原本的模板渲染逻辑,确保两个表单对象都传入模板上下文
    return render(request, '你对应的模板路径.html', {
        'posts': posts,
        'captcha': captcha,
        'form': form
    })
额外注意事项
  • 确认模板中验证码字段和帖子提交的其它字段都在同一个<form>标签内,否则POST请求不会携带验证码参数,会导致校验永远失败
  • 可以在校验失败后给前端返回验证码错误的提示,引导用户重新填写

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:45:03