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

Django更新部门触发main_department.dept_name非空约束失败如何解决

问题根因

你遇到的NOT NULL constraint failed: main_department.dept_name报错是因为前端模板提交的表单字段名和后端视图读取的字段名完全不匹配,导致后端取不到部门名称的值,触发数据库非空约束。
具体不匹配的地方:

  • 你在update_dept.html中,部门名称输入框的name属性写的是name,但后端update_dept_data视图中取的是request.POST.get('dept_name'),获取结果为None
  • 部门邮箱输入框的name属性写的是price,后端取的是request.POST.get('dept_Email'),同样获取结果为None

修复方案

1. 修正模板字段名

修改update_dept.html中的两个输入框配置:

<!-- 部门名称输入框 -->
<div class="mb-3">
    <label class="form-label">部门名称</label>
    <input type="text" required name="dept_name" value="{{ prod.dept_name }}" class="form-control">
</div>
<!-- 部门邮箱输入框 -->
<div class="mb-3">
    <label class="form-label">部门邮箱</label>
    <input type="email" required name="dept_Email" value="{{ prod.dept_Email }}" class="form-control">
</div>

如果你的业务需要支持修改部门密码,还要额外加密码输入框:

<div class="mb-3">
    <label class="form-label">部门密码</label>
    <input type="password" required name="dept_password" value="{{ prod.dept_password }}" class="form-control">
</div>

同时要在后端update_dept_data视图中增加密码的赋值逻辑:

prod.dept_password = request.POST.get('dept_password')

2. 优化建议(可选)

推荐直接使用Django的ModelForm处理更新逻辑,避免手动处理字段时出现拼写错误,修改后的视图代码如下:

def update_dept_data(request, id):
    prod = Department.objects.get(id=id)
    if request.method == "POST":
        form = Departmentform(request.POST, instance=prod)
        if form.is_valid():
            form.save()
            messages.success(request, "部门更新成功")
            return redirect('/')
    context = {'prod': prod, 'form': Departmentform(instance=prod)}
    return render(request, 'main/update_dept.html', context)

模板可以直接渲染表单字段,无需手动写输入框,从根源避免字段名不匹配的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:06:06