
本文详解 django 中如何正确接收和处理 html 表单提交的 post 请求,涵盖 csrf 保护、视图逻辑编写、数据提取与验证等关键步骤,帮助初学者避免常见错误。
本文详解 django 中如何正确接收和处理 html 表单提交的 post 请求,涵盖 csrf 保护、视图逻辑编写、数据提取与验证等关键步骤,帮助初学者避免常见错误。
在 Django 开发中,表单提交是最基础也最容易出错的操作之一。你遇到的问题——request.method == "GET" 判断始终不成立,根本原因在于:你发送的是 POST 请求,却用 GET 来判断;同时缺少 Django 强制要求的 CSRF 安全令牌。
✅ 正确做法:三步到位
1. HTML 模板中必须添加 {% csrf_token %}
Django 默认启用 CSRF(跨站请求伪造)防护机制,所有 POST(及 PUT、DELETE 等)请求必须携带有效的 CSRF token,否则 Django 会直接返回 403 Forbidden 错误,且 request.method 甚至不会进入你的视图函数逻辑(更不会执行 print)。
请将你的
⚠️ 注意:
- action="fd.py" 是无效路径(Django 不直接运行 .py 文件),应改为命名 URL(如 {% url 'find_rqst' %})或相对路径(如 . 或 /register/);
- name="repassword" 的 input 字段在后端需通过 request.POST.get('repassword') 获取,而非 confirm_password(该变量未定义);
- 建议为按钮添加明确文字(如 type="submit" + 文本),便于调试与可访问性。
2. 视图函数中正确判断并处理 POST 请求
你的视图函数 FindRqst 应优先检查 request.method == "POST",而非 "GET"。此外,需引入必要模块并完善逻辑:
# views.py
from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.contrib.auth import login
from django.contrib import messages
def FindRqst(request):
# ✅ 处理 POST 请求
if request.method == "POST":
# 安全获取字段(避免 KeyError)
username = request.POST.get("username", "").strip()
email = request.POST.get("email", "").strip()
password = request.POST.get("password", "")
repassword = request.POST.get("repassword", "")
# ✅ 基础验证
if not (username and email and password and repassword):
messages.error(request, "All fields are required.")
return render(request, "registration.html")
if password != repassword:
messages.error(request, "Passwords do not match.")
return render(request, "registration.html")
# ✅ 创建用户(推荐使用 Django 内置 User 模型或自定义模型的 create_user 方法)
try:
# 示例:若使用 Django 默认 User 模型
from django.contrib.auth.models import User
user = User.objects.create_user(
username=username,
email=email,
password=password
)
login(request, user) # 自动登录新用户
return redirect("login") # ✅ 重定向至登录页(需配置 URL name)
except Exception as e:
messages.error(request, f"Registration failed: {str(e)}")
return render(request, "registration.html")
# ✅ GET 请求:返回空表单页面
return render(request, "registration.html")
? 关键说明:
- 使用 request.POST.get() 替代 request.POST["key"],防止因字段缺失导致 KeyError;
- messages 框架用于向模板传递用户友好的提示信息(需在 settings.py 启用 django.contrib.messages);
- redirect() 是最佳实践——避免重复提交(POST-Redirect-GET 模式);
- 若使用自定义用户模型(如 CustomUser),请确保已正确注册并调用其 create_user 方法(而非直接 save())。
3. URL 配置与模板渲染一致性
确保 urls.py 中正确映射视图:
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('register/', views.FindRqst, name='find_rqst'), # ✅ 给 URL 命名
]
并在模板中使用命名 URL:
? 总结:新手避坑清单
- ❌ 不要写 action="fd.py" —— Django 无文件直访机制;
- ❌ 不要漏掉 {% csrf_token %} —— POST 请求必加;
- ❌ 不要用 request.POST["field"] 直接取值 —— 优先用 .get();
- ✅ 所有表单提交逻辑统一用 if request.method == "POST": 判断;
- ✅ POST 处理完成后务必 return redirect(...),禁止直接 return render(...);
- ✅ 在开发阶段开启 DEBUG=True,并查看 Django 调试页面中的 403 错误提示,快速定位 CSRF 问题。
掌握这几点,你就能稳定、安全地处理 Django 表单提交了。











