已添加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
相关产品推荐
相关产品推荐

