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

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函数中的三类模型查询代码,问题仍未解决。

核心原因分析

  1. 全局变量线程不安全:使用全局error和email会导致多用户/多请求之间的状态污染,错误信息会被保留到下一次请求中。
  2. 表单处理逻辑错误:直接给表单实例赋值属性(如form2.email = email)不符合Django表单规范,会导致表单验证失败或数据无法正确保存。
  3. 错误提示逻辑不合理:非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,检查模板中的转义是否正常,可尝试将模板中的&lt;form method=&quot;post&quot;...&gt;改为直接写<form method="post" action="{% url 'create' %}">(Django模板会自动处理安全转义)。

关键说明

  • 避免使用全局变量存储请求相关状态,Session是更安全的选择。
  • 处理Django表单时,通过commit=False获取未保存实例后补充字段,是正确的字段赋值方式。
  • 仅在表单验证失败时设置错误信息,避免首次访问页面就显示错误提示。

内容的提问来源于stack exchange,提问作者Something 4

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:40:34