Django表单设置POST却始终返回GET请求问题求助
Django表单提交始终为GET请求的解决方案
核心问题:重复的表单标签
你使用了{% crispy form %}标签,这个标签会自动生成完整的<form>标签、提交按钮以及表单字段,但你又在外层手动嵌套了一个<form>标签,导致HTML结构冲突,浏览器解析时忽略了你设置的method="post",最终以GET方式提交。
修复步骤
1. 修正HTML模板(移除重复的form标签和手动提交按钮)
删除你手动添加的<form action="" method="post">、</form>以及独立的<input type="submit">,因为{% crispy form %}已经包含这些元素:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <style> input { width: 10%; margin: 0 auto; display: block; margin-left: auto; margin-right: auto; } </style> </head> <body> {% load crispy_forms_tags %} <div class="container"> {% csrf_token %} {% crispy form %} </div> </body> </html>
2. 优化视图逻辑(正确处理POST请求并避免重复提交)
原视图存在两个问题:一是POST处理后的表单没有传入模板,二是验证成功后未重定向,容易导致刷新重复提交。修正后的代码:
from django.shortcuts import render, redirect from .forms import UserInformationForm def register(request): if request.method == "POST": form = UserInformationForm(request.POST) if form.is_valid(): form.save() # 验证成功后重定向到注册页或其他页面,替换为你的目标URL/视图名 return redirect('register') else: # GET请求时生成空表单 form = UserInformationForm() context = {"form": form} return render(request, 'index.html', context)
关于添加GET判断后出现必填提示的原因
你之前的代码逻辑混乱:无论请求方式是GET还是POST,都先初始化了一个空表单,POST处理时重新创建的表单没有传入context,模板始终拿到的是初始空表单。当你添加GET判断后,错误的逻辑导致表单未正确初始化,必填字段因未填充而触发验证提示,按照上面的视图逻辑即可解决。
内容的提问来源于stack exchange,提问作者ODOshmockenberg
相关产品推荐
相关产品推荐

