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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:13:12