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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:46:07