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

Django弹窗编辑产品提交后修改内容未保存如何解决

问题根因

编辑后数据不更新是前后端逻辑同时存在缺失导致,核心问题有3个:

  • 后端编辑分支仅查询到了对应零件对象,直接调用save()没有把用户提交的新值赋值给对象属性,相当于重复存储了一遍原数据,不会产生任何变更
  • 前端编辑表单除brand字段外,其余number/name/description等输入框均未设置name属性,后端无法接收这些字段的提交值
  • 前端表单未传递编辑操作标识和待编辑零件ID,后端无法正确匹配编辑请求、定位待修改的数据行
    另外前端代码还存在标签写法错误:误将textarea写成input的type属性,多行文本输入无法正常传值。
修复方案

1. 修正后端视图逻辑

编辑逻辑需要复用ModelForm的实例绑定能力,将用户提交的数据绑定到待修改的现有数据行上,校验通过后再保存,不要手动查对象空存:

from django.shortcuts import get_object_or_404

def parts(request):
    added = ''
    error = ''
    PartAllView = Part.objects.order_by('-id')

    if request.method == 'POST' and 'parts_add' in request.POST:
        form = PartForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            added = 'Добавлено'
        else:
            error = 'Данная запчасть уже добавлена'

    if request.method == 'POST' and 'parts_edit' in request.POST:
        edit_id = int(request.POST['parts_edit'])
        # 用get_object_or_404避免非法ID触发服务器500错误
        part_instance = get_object_or_404(Part, id=edit_id)
        # 提交数据绑定到现有实例,而非新建数据
        form = PartForm(request.POST, request.FILES, instance=part_instance)
        if form.is_valid():
            form.save()
            added = 'Запчасть успешно отредактирована'
        else:
            error = 'Ошибка редактирования'


    form = PartForm()

    data = {
        'added': added,
        'error': error,
        'form': form,
        'PartAllView': PartAllView,
    }

    return render(request, 'kross/parts.html', data)

2. 修正前端表单代码

给所有输入字段补全和模型字段名一致的name属性,新增隐藏字段传递编辑操作标识和待编辑ID,修正错误的文本域标签,补全提交按钮:

{% if PartAllView %}
{% for el in PartAllView %}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<!-- 隐藏字段:标记编辑请求,传递待编辑零件ID -->
<input type="hidden" name="parts_edit" value="{{ el.id }}">
<div class="modal fade" id="partEdit{{ el.id }}">
  <div class="modal-dialog modal-dialog-centered text-center" role="document">
    <div class="modal-content modal-content-demo">
      <div class="modal-header">
        <h6 class="modal-title">Редактирование запчасти</h6>
        <button aria-label="Close" class="btn-close" data-bs-dismiss="modal">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>

      <div class="modal-body">
        <div class="row row-sm">
          <div class="col-lg-6">
            <div class="form-group">
              <input type="text" class="form-control" name="brand" value="{{ el.brand }}">
            </div>
          </div>
          <div class="col-lg-6">
            <div class="form-group">
              <!-- 补全name属性 -->
              <input type="text" class="form-control" name="number" value="{{ el.number }}">
            </div>
          </div>
          <div class="col-lg-12">
            <div class="form-group">
              <!-- 补全name属性 -->
              <input type="text" class="form-control" name="name" value="{{ el.name }}"><br>
              <!-- 修正textarea标签写法,文本内容放在标签内部 -->
              <textarea class="form-control" name="description" rows="2">{{ el.description }}</textarea>
            </div>
          </div>
        </div>
        <!-- 其余字段比如analog同理补全name属性 -->
        <div class="form-group">
          <input type="text" class="form-control" name="analog" value="{{ el.analog }}">
        </div>
      </div>
      <div class="modal-footer">
        <button type="submit" class="btn btn-primary">Сохранить</button>
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
      </div>
    </div>
  </div>
</div>
</form>
{% endfor %}
{% endif %}
注意事项
  • 所有输入字段的name属性值必须和Part模型、PartForm中定义的字段名完全一致,否则后端无法正常接收字段值
  • form标签必须完整包裹弹窗内的所有输入项和提交按钮,不能被弹窗的div结构截断,否则提交时会丢失表单数据
  • 若Part模型存在必填字段,编辑表单中必须包含对应字段的输入项,否则会触发表单校验失败

内容的提问来源于stack exchange,提问作者Капуста

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:16:04