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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:21:01