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

已添加csrf_token,Django仍报403 Forbidden错误求助

Django表单提交403错误排查与修复

你的代码里有几个核心错误,直接导致了请求处理异常,以下是具体问题和修复方案:

1. 表单实例化写法完全错误

在newpage函数的POST分支中,form = request.POST()是完全错误的:

  • request.POST是Django提供的类字典对象,不是可调用函数,直接调用会触发异常,导致请求处理中断,这很可能是你看到403错误的核心诱因。
  • 正确做法是用你定义的newEntry表单类来接收POST数据:
form = newEntry(request.POST)

2. 反向路由缺少必要参数

表单验证通过后,你调用reverse('encyclopedia:title')跳转,但title路由要求传入name参数(对应URL规则<str:name>),不传参数会抛出NoReverseMatch异常,修正后:

return HttpResponseRedirect(reverse('encyclopedia:title', args=[title]))

3. 错误分支未保留用户输入

当前else分支里form = newEntry()会生成空表单,用户之前输入的内容会丢失,应该直接返回验证失败的表单,保留输入内容和错误提示:

else:
    return render(request, "encyclopedia/newentry.html", { "form": form })

修复后的完整views.py代码

# views.py
def newpage(request):
    if request.method == 'POST':
        form = newEntry(request.POST)
        print(form.is_valid())
        if form.is_valid():
           title = form.cleaned_data.get('title')
           content = form.cleaned_data.get('content')
           util.save_entry(title,  f'# {title}\n\n{content}')
           return HttpResponseRedirect(reverse('encyclopedia:title', args=[title]))
        else:
           return render(request, "encyclopedia/newentry.html", { "form": form })
    else:
       form = newEntry()
    return render(request, "encyclopedia/newentry.html", { "form": form })

额外确认项

  • 确保newEntry表单类正确继承自django.forms.Form或ModelForm,且title、content字段已正确定义。
  • 模板中的{% csrf_token %}已存在且浏览器能捕获到,这部分没问题,核心问题还是表单实例化的错误写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:03:14