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

Django点击卡片弹出Modal加载数据库数据无内容问题咨询

Django卡片服务列表点击弹窗无内容问题排查修复

问题根因

现有代码存在3处核心逻辑断层,直接导致弹窗可正常唤起但无对应内容:

  • 模板渲染时机错误:Django模板变量{{details.pkg_name}}、{{details.content}}是页面首次加载时就完成解析的,首次加载服务列表页时上下文未传入details对象,这两个位置从初始渲染时就是空值;后续AJAX请求返回数据时不会自动触发模板重新渲染,内容自然无法展示。
  • 数据未做关联匹配:后端AJAX视图直接返回Details模型全表数据,前端点击按钮时也未传递当前卡片的唯一标识,就算接口返回数据也无法匹配到当前点击卡片对应的详情条目。
  • JS逻辑缺失:AJAX请求成功回调中仅执行了弹窗唤起操作,未编写「将接口返回数据插入弹窗对应DOM节点」的逻辑,接口返回的数据没有被实际使用。
  • 冗余属性问题:将接口地址绑定在Modal标签上的设计不合理,无法区分不同卡片触发的请求参数。

逐文件修复方案

1. 调整services.html模板代码

首先修改卡片循环内的详情按钮,为每个按钮绑定当前卡片ID,去掉Modal上冗余的data-url属性,同时把Modal内部硬编码的模板变量替换为待填充的空容器:

{% block content %}
<!-- 卡片列表渲染部分 -->
<div class="card-list">
{% for package in packages %}
  <div class="card">
    <!-- 卡片原有展示内容 -->
    <button 
      type="button" 
      class="btn btn-primary modalbtn" 
      data-bs-toggle="modal" 
      data-bs-target="#cardModal"
      data-pkg-id="{{ package.id }}"
    >
      more details
    </button>
  </div>
{% endfor %}
</div>

<!-- 弹窗部分 -->
<div class="modal fade" id="cardModal" tabindex="-1" aria-labelledby="cardModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="cardModalLabel"></h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        <!-- 移除原有Django模板变量,留空等待JS填充数据 -->
        <div class="detail-content"></div>
      </div>
    </div>
  </div>
</div>
{% endblock %}

2. 调整views.py视图逻辑

修改AJAX处理视图,接收前端传递的卡片ID,过滤返回对应关联的详情数据,不要返回全表数据:

from django.http import JsonResponse
from django.views import View
from .models import Details

class AjaxHandlerView(View):
    def get(self, request):
        if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
            # 接收前端传递的当前卡片ID
            pkg_id = request.GET.get('pkg_id')
            # 根据模型实际关联关系过滤对应详情,外键字段按实际表结构调整
            detail = Details.objects.get(package_id=pkg_id)
            # 仅返回需要展示的字段
            result = {
                'pkg_name': detail.pkg_name,
                'content': detail.content
            }
            return JsonResponse(result, status=200)
        return JsonResponse({'error': '非法请求'}, status=400)

3. 补全base.js交互逻辑

在AJAX回调中增加参数传递、DOM填充逻辑,弹窗关闭时记得清空旧内容避免缓存:

document.addEventListener('DOMContentLoaded', function() {
  const modalEl = document.getElementById('cardModal');
  const modalTitle = modalEl.querySelector('.modal-title');
  const modalContent = modalEl.querySelector('.detail-content');
  const modalInstance = new bootstrap.Modal(modalEl);
  // 接口地址可从body标签的data属性取,避免硬编码
  const apiUrl = '/services/data/'; // 替换为Services_data路由的实际地址

  // 为所有详情按钮绑定点击事件
  document.querySelectorAll('.modalbtn').forEach(btn => {
    btn.addEventListener('click', function() {
      const currentPkgId = this.dataset.pkgId;
      // 发起请求时携带当前卡片ID
      fetch(`${apiUrl}?pkg_id=${currentPkgId}`, {
        method: 'GET',
        headers: {
          'X-Requested-With': 'XMLHttpRequest'
        },
        credentials: 'same-origin'
      })
      .then(res => res.json())
      .then(data => {
        // 将返回数据填充到弹窗对应位置
        modalTitle.textContent = data.pkg_name;
        modalContent.innerHTML = data.content;
        // 内容填充完成后再唤起弹窗
        modalInstance.show();
      })
      .catch(err => {
        console.error('详情加载失败:', err);
        modalContent.textContent = '详情加载失败,请稍后重试';
        modalInstance.show();
      })
    })
  })

  // 弹窗关闭时清空内容,避免下次打开显示上一次的旧数据
  modalEl.addEventListener('hidden.bs.modal', function() {
    modalTitle.textContent = '';
    modalContent.innerHTML = '';
  })
})

小提示:如果不想硬编码接口路径,可以在base模板的body标签上添加data-services-api="{% url 'Services_data' %}",JS中通过document.body.dataset.servicesApi获取地址,后续路由调整时无需修改JS代码。


快速验证步骤

  • 修改完成后打开浏览器开发者工具,点击详情按钮时查看Network面板,确认AJAX请求携带了正确的pkg_id参数,返回的JSON数据为当前卡片对应的详情内容
  • 查看Console面板是否有JS报错,重点确认弹窗内标题、内容容器的选择器和JS代码中的选择器完全匹配,无类名、ID拼写错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:48:25