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

Django ModelForm更新设置时报Bad info错误无法更新数据库如何解决

问题原因及修复方案

1. 缺失表单校验步骤(核心问题)

Django ModelForm在调用save()方法前必须先调用form.is_valid()执行数据校验,你当前的视图逻辑跳过了校验步骤,表单数据不合法时直接调用save()就会抛出异常,被你写的except ValueError捕获后就返回了Bad info错误。
修复后的视图代码:

def viewSettings(request,  settings_pk):
    setting = get_object_or_404(SettingsClass, pk=settings_pk)
    if request.method == 'GET':
        form = SettingUpdateForm(instance=setting)
        return render(request, 'main/viewSettings.html', {'setting': setting, 'form':form})
    else:
        form =  SettingUpdateForm(request.POST, instance=setting)
        # 新增校验逻辑
        if form.is_valid():
            form.save()
            return redirect('settingsHome')
        # 校验不通过直接返回带错误的表单,不需要额外捕获异常
        return render(request, 'main/viewSettings.html', {'setting': setting, 'form':form, 'error':'Bad info'})

2. 模板缺失必填字段Complex的渲染

你的SettingUpdateForm配置了fields = '__all__',包含模型里的Complex字段,但是模板里没有渲染这个字段的输入控件。Complex字段是CharField且没有设置blank=True,属于必填项,提交时该字段为空就会触发校验失败。
你可以二选一修复:

  • 方案A:在模板合适位置添加Complex字段的渲染代码,比如放在标题下方:
    <h2 style="text-align: center">{{ setting.Complex }}</h2>
    <!-- 新增Complex字段输入框 -->
    <div style="padding: 0 1%; margin-bottom: 20px;">
      {{ form.Complex.label_tag }}
      {{ form.Complex }}
    </div>
    <hr>
    
  • 方案B:如果你不需要修改Complex字段,直接修改SettingUpdateForm的配置,排除Complex字段:
    class SettingUpdateForm(ModelForm):
        class Meta:
            model = SettingsClass
            exclude = ['Complex'] # 排除不需要修改的字段
    

3. 调试优化建议

你当前只返回笼统的Bad info错误,不方便定位问题,可以在模板里添加表单错误渲染代码,就能看到具体是哪个字段校验不通过:

{% if form.errors %}
<div class="alert alert-danger">
  <ul>
  {% for field in form %}
    {% for error in field.errors %}
      <li>{{ field.label }}: {{ error }}</li>
    {% endfor %}
  {% endfor %}
  {% for error in form.non_field_errors %}
    <li>{{ error }}</li>
  {% endfor %}
  </ul>
</div>
{% endif %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:18:01