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

Django渲染异常:console.log与页面源订单号不一致

问题原因

当订单号是纯数字组成的字符串时,Django模板直接输出后会被JavaScript当作数值类型解析。而JavaScript的Number类型是双精度浮点数,无法精确表示超过2^53的整数,会导致数字部分出现精度丢失,这就是控制台显示的id部分和页面源码不一致的核心原因。

代码问题点

模板中的{{ order.order_number }}未被当作字符串传递给JS,直接输出成了数值,触发了JS的精度丢失问题。

解决办法

方法1:用引号包裹订单号

在模板里把订单号用单引号或双引号包裹,强制JS将其识别为字符串:

<script>
    console.log('order number 0: ', '{{ order.order_number }}')
</script>

方法2:使用json_script过滤器(更安全)

借助Django模板的json_script过滤器,安全地将数据传递给JS:

{{ order.order_number|json_script:"order-number" }}
<script>
    const orderNumber = JSON.parse(document.getElementById('order-number').textContent);
    console.log('order number 0: ', orderNumber);
</script>

额外修复视图潜在问题

原视图中如果form.is_valid()不通过,datas变量会未定义,导致后续datas.order_number报错。建议把订单查询逻辑移到表单验证通过的分支内,同时处理验证失败的情况:

if request.method == "POST": 
    form = OrderForm(request.POST)
    if form.is_valid():
        datas = Order()
        datas.user = current_user
        datas.save()

        current_datetime = datetime.datetime.now().strftime('%Y%H%S%m%M%d')
        order_number = current_datetime + str(datas.id)
        datas.order_number = order_number 
        datas.save()

        # 将订单查询移到验证通过的分支内,避免报错
        order = Order.objects.get(user=current_user, is_ordered=False, order_number=datas.order_number)
        context['order'] = order
    else:
        # 这里可以添加表单验证失败的处理逻辑,比如返回错误提示
        pass
    context['user'] = request.user
    return render(request, 'orders/order.html', context) 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:32:11