- 展示:Django返回一个带有按钮的静态HTML页面。
- 触发:用户点击按钮,浏览器向后端发送请求。
- 响应:Django接收请求,处理后返回提示信息。
这里有两种实现方式:一种是传统的页面刷新方式 (简单),一种是现代的AJAX方式(体验更好,不刷新页面)。
方式一:传统表单提交 (页面会刷新)
这种方式最简单,符合Django MTV模式的标准流程。点击按钮后,页面会刷新,并在顶部显示提示信息。
1. 准备静态HTML文件
在项目的 templates 文件夹下创建 index.html。
这里的关键是使用 <form> 标签包裹按钮,点击按钮时会自动向Django发送POST请求。
代码生成完成
HTML代码
2. 编写视图逻辑
视图需要处理两种情况:如果是 GET 请求,就显示页面;如果是 POST 请求(用户点击了按钮),就处理逻辑并返回提示。
# views.py
from django.shortcuts import render, redirect
from django.contrib import messages # 引入Django内置的消息框架
# 展示页面的视图
def index_page(request):
return render(request, 'index.html')
# 处理按钮提交的视图
def submit_action(request):
# 必须是POST请求才处理
if request.method == 'POST':
# 获取按钮提交的值,判断用户点击了哪个按钮(如果有多个)
action = request.POST.get('action')
if action == 'confirm':
# 在这里编写你的业务逻辑(如保存数据库)
print("用户点击了确认按钮,执行后台逻辑...")
# 添加提示信息到消息框架
messages.success(request, '操作成功!已收到您的提交请求。')
# 处理完后,重定向回展示页面 (PRG模式)
return redirect('index_page')
3. 配置URL路由
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index_page, name='index_page'),
path('submit/', views.submit_action, name='submit_action'),
]
方式二:AJAX异步提交 (页面不刷新)
如果你希望点击按钮后,页面不刷新,直接弹窗提示,需要结合JavaScript(jQuery为例)和Django的JSON响应。
1. HTML页面 (引入JS)
代码生成完成
HTML代码
2. 视图返回JSON数据
# views.py
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt # 仅演示,生产环境请确保有CSRF保护
@csrf_exempt # 测试用,生产环境建议去掉并用常规CSRF处理
def index_page(request):
return render(request, 'index.html')
@csrf_exempt
def ajax_submit(request):
if request.method == 'POST':
# 执行后台逻辑...
return JsonResponse({'status': 'ok', 'message': '后台处理成功,这是您的提示!'})
return JsonResponse({'status': 'error'}, status=400)
总结建议
- 如果你是初学者 ,或者项目比较传统,推荐使用方式一 。它利用了Django内置的
messages框架和重定向机制,安全且符合Web标准。 - 如果你追求用户体验 ,希望像现代App一样无刷新操作,请使用方式二。
get请求方式后的提交:
在Django中,处理传统表单的 GET 请求与 POST 请求非常相似,但核心区别在于数据的获取方式和应用场景。
GET 请求通常用于"获取/查询"数据 (如搜索框、筛选列表),而 POST 请求通常用于"提交/修改"数据。
以下是处理 GET 请求表单的完整流程:
1. 前端HTML:修改 <form> 标签
关键点在于将 method 属性设置为 "get"。提交后,参数会拼接在 URL 后面(例如 http://127.0.0.1:8000/search/?q=django) 。
代码生成完成
HTML代码
2. 后端视图:使用 request.GET
在视图中,不再使用 request.POST,而是使用 request.GET 来获取参数。request.GET 是一个类似字典的对象。
# views.py
from django.shortcuts import render
def search_view(request):
# 初始化上下文,用于存储结果
context = {}
# 1. 判断是否是 GET 请求 (通常通过检查参数是否存在来判断)
# request.GET.get('key') 是获取值的常用方法,如果key不存在返回None
query_text = request.GET.get('query')
if query_text:
# 2. 业务逻辑处理:模拟在数据库中搜索
# 这里仅作演示,实际会使用 MyModel.objects.filter(name__contains=query_text)
print(f"后端接收到了搜索关键词: {query_text}")
processed_result = f"找到了关于 '{query_text}' 的 10 条记录"
# 3. 将结果放入上下文,准备渲染回页面
context['result'] = processed_result
context['query'] = query_text # 回填到输入框,保持用户体验
else:
# 如果没有带参数(初次进入页面),可以什么都不做,或显示默认内容
context['result'] = "请输入关键词进行搜索。"
return render(request, 'search_form.html', context)
3. URL配置
配置与普通视图无异。
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('search/', views.search_view, name='search_view'),
]
🔍 关键点详解
1. 获取数据的方法
- 推荐写法 :
value = request.GET.get('key')- 如果 URL 中没有该参数,返回
None,不会报错。
- 如果 URL 中没有该参数,返回
- 不推荐写法 :
value = request.GET['key']- 如果 URL 中没有该参数,会抛出
MultiValueDictKeyError异常,导致页面崩溃(500错误)。
- 如果 URL 中没有该参数,会抛出
2. 处理多选框 (CheckBox)
GET 请求也常用于筛选。如果一个表单里有多个复选框(如爱好选择),name 相同但 value 不同:
代码生成完成
HTML代码
后端获取时需要用 getlist:
hobbies = request.GET.getlist('hobby')
# 结果是一个列表: ['coding', 'reading']
3. GET 请求不需要 CSRF Token
这是一个重要的区别。
- POST :Django 强制要求
<form>里必须有{% csrf_token %},否则拒绝访问。 - GET:Django 默认不验证 GET 请求的 CSRF Token。因为 GET 被定义为"安全"的读取操作,不应该改变服务器数据。
📋 POST vs GET 处理对比
| 特性 | GET 请求 | POST 请求 |
|---|---|---|
| HTML form method | method="get" |
method="post" |
| 后端获取数据 | request.GET.get('key') |
request.POST.get('key') |
| 数据位置 | URL 参数中 (?key=value) |
HTTP 请求体中 |
| 安全性 | 低(URL可见,不适合传密码) | 高(不可见) |
| CSRF 验证 | 不需要 | 必须 加 {% csrf_token %} |
| 典型场景 | 搜索、筛选、排序 | 登录、注册、修改数据 |
总结
处理 GET 表单的核心步骤:
- HTML中
<form method="get">。 - 后端用
request.GET.get('表单name属性')接收。 - 处理数据后
render回页面,即可实现"打开页面 -> 输入 -> 提交 -> 看到结果"的闭环。