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

