Django视图问题:今日ChartEntry追加描述时重复新增值,求排查
Django视图追加描述时出现重复新值的问题解决
你遇到的问题核心是表单初始化时已经修改了原对象的属性,导致后续拼接用的todaysentry.description已经是POST提交的新值,而非数据库里的旧值。
问题根源
当你执行form = ChartEntryForm(request.POST, instance=todaysentry)时,Django表单会直接把POST中的description值绑定到todaysentry对象的description属性上(因为instance参数指向的是同一个对象引用)。此时即便还没调用form.save(),todaysentry.description已经被改成了新提交的值。后续你再执行form.instance.description = todaysentry.description + ";" + request.POST["description"],本质就是新值 + ";" + 新值,自然得到newvalue;newvalue的结果。
解决代码
只需提前保存旧描述值,避免被表单修改后影响拼接逻辑:
@login_required def chartentry_create(request, chart_id): obj = get_object_or_404(Chart, id=chart_id) todaysentry = obj.chartentries.filter( created_at__date=timezone.now().date() ).first() # 提前保存旧描述,避免被表单修改 old_description = todaysentry.description if todaysentry else None # 初始化表单 if todaysentry: form = ChartEntryForm(request.POST, instance=todaysentry) else: form = ChartEntryForm(request.POST or None) if form.is_valid(): if todaysentry: # 使用提前保存的旧描述拼接新值 form.instance.description = f"{old_description};{request.POST['description']}" form.instance.chart = obj form.save() messages.success(request, "Entry updated successfully") else: for error in form.errors: messages.error(request, form.errors[error]) if is_ajax(request): context = {"chart": obj} return render(request, "chart_entries_by_patient_partial.html", context) else: return redirect("chart-detail", patient_id=obj.patient.id)
额外优化
把日期查询改成created_at__date=timezone.now().date(),比手动替换时分秒更简洁可靠。
内容的提问来源于stack exchange,提问作者Dova Kin
相关产品推荐
相关产品推荐

