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

Django视图传递到HTML的列表数据如何传给同页面JavaScript使用

解决方案

问题原因

你直接将Django ORM模型对象列表传入模板时,Django会自动调用对象的__str__方法将其转换为字符串输出,同时默认开启HTML转义,因此你拿到的是[<Load: Load object (1)>]这种转义后的字符串,无法直接作为JS数组操作。

步骤1:修改视图层,将模型列表序列化为JSON格式

你需要先在视图层把要传给JS的列表数据序列化为合法的JSON字符串,两种常用实现方式:

方式A:手动构造字典列表(更灵活,推荐)

import json

def index(request):
    # 原有逻辑不变
    body=list(Body.objects.all())
    loads=list(Load.objects.all().order_by('length'))
    badLoads=[]
    goodLoads=[]
    for load in loads:
        if load.length>body[0].length or load.width>body[0].width or load.mass>body[0].mass:
            badLoads.append(load)
        else:
            goodLoads.append(load)

    goodLoadsLength=len(goodLoads)
    # 新增:手动转模型列表为字典列表,再序列化为JSON字符串
    good_loads_list = [
        {
            "id": load.id,
            "length": load.length,
            "width": load.width,
            "height": load.height,
            "mass": load.mass
        } for load in goodLoads
    ]
    bad_loads_list = [
        {
            "id": load.id,
            "length": load.length,
            "width": load.width,
            "height": load.height,
            "mass": load.mass
        } for load in badLoads
    ]
    good_loads_json = json.dumps(good_loads_list)
    bad_loads_json = json.dumps(bad_loads_list)

    context={
        'body':body[0],
        'loads':loads,
        'badLoads':badLoads,
        'goodLoads':goodLoads,
        'goodLoadsLength':goodLoadsLength,
        # 新增序列化后的JSON字段传入上下文
        'good_loads_json': good_loads_json,
        'bad_loads_json': bad_loads_json,
    }
    return render(request,'index.html',context)

方式B:使用Django内置序列化器(代码更简洁)

from django.core import serializers

def index(request):
    # 原有逻辑不变
    # ...省略重复代码...
    # 新增:直接用序列化器转模型列表为JSON,fields指定需要导出的字段
    good_loads_json = serializers.serialize('json', goodLoads, fields=('id','length','width','height','mass'))
    bad_loads_json = serializers.serialize('json', badLoads, fields=('id','length','width','height','mass'))
    # 上下文传入逻辑同上

步骤2:修改模板JS取值逻辑

在模板的script标签中,使用safe过滤器关闭Django的自动HTML转义,直接将JSON字符串转为JS对象:

<script>
// 数字类型不需要加引号
const loadsLength = {{goodLoadsLength}};
// 直接赋值即可,JSON本身是合法的JS对象字面量
const goodLoads = {{ good_loads_json|safe }};
const badLoads = {{ bad_loads_json|safe }};
</script>

效果验证

拿到JS数组后就可以正常遍历操作了:

// 手动序列化(方式A)的取值方式
goodLoads.forEach(load => {
    console.log('货物ID:', load.id, '货物长度:', load.length)
})

// 内置序列化器(方式B)的取值方式,字段都存在fields属性下
goodLoads.forEach(load => {
    console.log('货物ID:', load.pk, '货物长度:', load.fields.length)
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:36:03