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

如何通过JavaScript点击行获取索引并动态显示Django对象?

解决Django模板中JS动态获取对象属性的问题

为啥会出这问题?

Django模板的{{ }}变量是服务器端提前渲染的,等页面发送到浏览器、JavaScript开始执行时,服务器早就把模板里的变量处理完了。你写的{{ project.id.customer_name }}里的id是JS的动态变量,但服务器渲染时根本认不出它,只会把id当成字符串去解析,自然拿不到正确的值。而固定索引的{{ project.1.customer_name }}是服务器直接渲染好的静态内容,所以能正常显示。

两种解决办法

方法1:把project转成JSON给JS用

这是最通用的方案,把Django的project列表序列化成JSON,让JS直接操作这个数组:

  1. 在模板里用json_script过滤器生成JSON数据:
{{ project|json_script:"project-data" }}

这个过滤器会自动生成一个<script>标签,id是project-data,里面存的是序列化后的JSON字符串。

  1. 在JS里读取这个JSON,绑定点击事件:
// 拿到服务器传过来的项目数据
const projects = JSON.parse(document.getElementById('project-data').textContent);

// 给每一行加点击事件
document.querySelectorAll('table tr').forEach((row, index) => {
  row.onclick = function() {
    const selected = projects[index];
    // 这里就可以用selected.customer_name了
    console.log(selected.customer_name);
    // 比如把内容显示到页面上:
    // document.getElementById('show-name').innerText = selected.customer_name;
  };
});

注意:如果project是Django模型对象,要先转成可序列化的格式,比如用Project.objects.all().values(),这样json_script才能正常序列化。

方法2:给表格行加data属性直接存数据

如果数据不多,也可以直接把需要的属性存在表格行的data-*属性里:

{% for item in project %}
  <tr data-customer="{{ item.customer_name }}">
    <td>{{ item.customer_name }}</td>
    <!-- 其他列内容 -->
  </tr>
{% endfor %}

然后JS里点击行时直接取这个属性:

document.querySelectorAll('table tr').forEach(row => {
  row.onclick = function() {
    const name = this.dataset.customer;
    console.log(name);
  };
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:25:27