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

Django表单设置post提交却始终触发GET请求是什么原因

问题原因及解决方案

  • 原因1:表单缺失CSRF令牌
    Django默认开启CSRF防护中间件,POST请求必须携带有效的CSRF令牌,否则请求会被拦截,部分场景下会触发重定向转为GET请求。你当前的<form>标签内没有添加对应的模板标签。
    修正方案:在create.html的<form>标签内部添加{% csrf_token %}:
<form method="post" action="/create/">
{% csrf_token %}
{{form.as_p}}
<button type="submit" name="save">Create New</button>
</form>

另外可删除button标签内多余的逗号,避免潜在的HTML解析问题。

  • 原因2:视图函数缩进错误导致无返回值
    你当前的create视图函数仅在GET请求分支有返回逻辑,如果是POST请求且表单校验未通过,函数没有返回任何响应,Django会触发异常后重定向页面,请求方法转为GET。
    修正方案:调整create函数的缩进,将渲染返回的逻辑移到if/else分支外部:
def create(response):
    print(response.method)
    if response.method == "POST":
        form = CreateNewList(response.POST)
        if form.is_valid():
            n = form.cleaned_data['name']
            t = ToDoList(name=n)
            t.save()
            return HttpResponseRedirect("/%i" %t.id)
    else:
        form = CreateNewList()
    # 以下行移出else分支,POST校验失败也会返回带错误信息的表单
    return render(response, "main/create.html", {"form":form})
  • 原因3:路径斜杠不匹配触发重定向
    Django默认开启APPEND_SLASH配置,如果你访问的页面地址是/create(无结尾斜杠),或者表单action属性写为/create(无结尾斜杠),Django会自动返回301重定向到带斜杠的/create/地址,重定向过程中POST请求会被转为GET请求。
    修正方案:确保访问地址、表单action属性都使用带结尾斜杠的/create/即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:36:03