Django中POST请求被识别为GET,create函数失效求助
问题:Create函数失效,页面显示“It's not POST, it's GET”
问题描述
之前正常工作的create函数现在失效,页面始终显示“It's not POST, it's GET”提示。尝试删除index函数中的email = str(request.GET.get('autorization_email'))以及create函数中的三类模型查询代码,问题仍未解决。
核心原因分析
- 全局变量线程不安全:使用全局
error和email会导致多用户/多请求之间的状态污染,错误信息会被保留到下一次请求中。 - 表单处理逻辑错误:直接给表单实例赋值属性(如
form2.email = email)不符合Django表单规范,会导致表单验证失败或数据无法正确保存。 - 错误提示逻辑不合理:非POST请求(如首次访问页面)就设置错误信息,导致页面一加载就显示错误。
解决方案
1. 移除全局变量,改用Session传递状态
Django的Session是线程安全的,适合存储用户级别的临时数据。修改views.py中的index和create函数:
修改后的views.py
from django.shortcuts import render, redirect from .models import Booking, Type, Model, Equipment from .forms import BookingForm def index(request): # 从GET参数获取email并存入Session email = request.GET.get('autorization_email') if email: request.session['email'] = email # 取出Session中的错误信息(用完即删除) error = request.session.pop('error', '') context = { 'title': 'Main page', 'error': error, 'index_email': request.session.get('email', '') } return render(request, 'main/index.html', context) def create(request): type_values = Type.objects.all() model_values = Model.objects.all() equipment_values = Equipment.objects.all() error = '' # 从Session获取用户email email = request.session.get('email', '') if request.method == 'POST': form2 = BookingForm(request.POST) if form2.is_valid(): # 先创建未保存的实例,再补充字段 booking = form2.save(commit=False) booking.email = email # 注意:如果type/model是外键,需要通过ID获取对应模型实例 booking.type = Type.objects.get(id=request.POST.get('type')) booking.model = Model.objects.get(id=request.POST.get('model')) booking.number = request.POST.get('number') booking.save() return redirect('autorization') else: error = '表单填写错误' else: # 非POST请求初始化空表单,不设置错误信息 form2 = BookingForm() context = { 'form': form2, 'error': error, 'type_values': type_values, 'model_values': model_values, 'equipment_values': equipment_values, 'create_email': email } return render(request, 'main/create.html', context)
2. 验证表单渲染正确性
在浏览器中打开create页面,查看源代码确认:
- 表单的
method属性为post - 存在
<input type="hidden" name="csrfmiddlewaretoken" value="...">的CSRF令牌字段
如果发现method被渲染为get,检查模板中的转义是否正常,可尝试将模板中的<form method="post"...>改为直接写<form method="post" action="{% url 'create' %}">(Django模板会自动处理安全转义)。
关键说明
- 避免使用全局变量存储请求相关状态,Session是更安全的选择。
- 处理Django表单时,通过
commit=False获取未保存实例后补充字段,是正确的字段赋值方式。 - 仅在表单验证失败时设置错误信息,避免首次访问页面就显示错误提示。
内容的提问来源于stack exchange,提问作者Something 4
相关产品推荐
相关产品推荐

