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
相关产品推荐
相关产品推荐

