Django中Field 'id'预期数字却传入QueryDict错误求助
问题分析与修复方案
错误核心原因
你在POST请求处理中直接将request.POST(QueryDict类型)传入Price模型类的构造函数,而非使用Django表单类处理请求数据。模型构造函数期望接收字段名与对应值的映射,直接传入QueryDict会导致模型错误地将整个QueryDict赋值给自动生成的主键id字段,保存时Django尝试将其转为整数类型,从而触发int() argument must be a string... not 'QueryDict'错误。
修复步骤
1. 创建ModelForm类
在你的app目录下新建/修改forms.py,定义对应Price模型的表单:
from django import forms from .models import Price class PriceForm(forms.ModelForm): class Meta: model = Price fields = ['HourlyPrice', 'DailyPrice', 'WeeklyPrice', 'MonthlyPrice']
2. 修改视图函数
替换视图中直接操作模型的逻辑,改用表单类处理请求:
from .forms import PriceForm from datetime import datetime def test(request): if request.method == 'POST': form = PriceForm(request.POST) # 必须先验证表单数据合法性 if form.is_valid(): form.save() return render(request,'app/index.html', { 'title':'Home Page', 'year':datetime.now().year, } ) # 验证不通过时,返回表单页面显示错误信息 return render(request,'app/test.html',{'form': form}) else: # GET请求生成空表单即可,无需传入request.GET form = PriceForm() context = { 'form': form, } return render(request,'app/test.html',context)
关键说明
- 表单类的核心作用是解析
request.POST数据、验证合法性,并将正确的字段值传递给模型,避免直接操作模型时的数据类型不匹配问题。 - 调用
form.is_valid()是必要步骤,它会自动校验数据是否符合模型字段的约束(比如必填项、数据格式等),若跳过可能引发其他隐性错误。
内容的提问来源于stack exchange,提问作者Muffin
相关产品推荐
相关产品推荐

