Django使用ModelForm提交数据时自增主键id不生效如何处理?
问题解决方法
错误原因
你触发报错的核心原因是错误使用了Django模型的位置参数传值:Django模型类的构造方法默认第一个位置参数为主键id字段,你直接传入
form.cleaned_data["delivery"]的布尔值时,系统会把这个值赋值给id字段,delivery字段反而没有收到任何赋值,所以才会触发delivery字段不能为null的报错,和主键自动递增的逻辑无关。
修复方案
方案1(最推荐):直接调用ModelForm的save方法
你已经用了Django的ModelForm封装逻辑,不需要手动取字段值创建实例,直接调用form.save()即可自动完成模型实例创建、字段赋值、数据存储的全流程,代码修改如下:
def get_order(request): if request.method == "POST": form = OrderForm(request.POST) if form.is_valid(): # 直接调用save方法,自动处理主键、字段赋值、存储 form.save() return HttpResponseRedirect("/end") else: form = OrderForm() return render(request, "forms/test.html", {"form": form})
方案2:手动创建实例时用关键字参数传值
如果你的业务场景需要手动处理实例创建逻辑,传值时指定字段名,不要用位置参数即可:
if form.is_valid(): # 用关键字参数指定delivery字段,主键id会自动生成 order_instance = Order(delivery=form.cleaned_data["delivery"]) order_instance.save() return HttpResponseRedirect("/end")
额外优化建议
给模型的BooleanField添加默认值,避免边界场景下的null报错:
class Order(models.Model): # 添加default参数,默认值可根据业务需求设为True/False delivery = models.BooleanField(default=False)
内容的提问来源于stack exchange,提问作者Titouan
相关产品推荐
相关产品推荐

