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

Django CRUD前端创建Activity报错:activity_id期望数字却得QueryDict

问题分析与修复方案

错误根源

你在create_activity视图的POST请求处理逻辑里,直接用Activity(form_data)来实例化模型,而不是使用你已经定义好的ActivityForm。这会导致Django把整个POST QueryDict对象当成参数传递给Activity模型的构造函数,进而触发"Field 'activity_id' expected a number but got "错误——因为模型期望接收单个字段的值,而不是整个请求参数集合。

修复后的views.py代码

from django.shortcuts import render, redirect
from .forms import ActivityForm

def create_activity(request):
    if request.method == "POST":
        form = ActivityForm(request.POST)
        if form.is_valid():  # 先验证表单数据合法性
            form.save()
            return redirect('activity_list')  # 替换成你实际的活动列表页URL名称
    else:
        form = ActivityForm()
    
    # 不管GET还是POST验证失败,都返回表单页面
    context = {'form': form}
    return render(request, 'activities/new_listing.html', context)

关键修改点

  • 用ActivityForm(request.POST)替代Activity(form_data):让表单类来处理请求参数的解析、字段映射和验证
  • 添加表单验证:form.is_valid()确保只有合法的数据才会被保存到数据库
  • 保存后重定向:避免用户刷新页面时重复提交表单
  • 统一上下文返回:原来的代码在POST分支没有返回逻辑,修复后不管是GET请求还是POST验证失败,都会正确渲染表单页面

为什么/admin面板正常

Django admin后台默认使用ModelForm(和你定义的ActivityForm同类型)来处理数据提交,它会自动完成请求参数到模型字段的映射、验证等流程,所以不会出现这个错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:05:26