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

Django模板中用Tailwind构建环形进度条时无法访问JS变量问题

Django 传递视图变量到 JavaScript 实现环形进度条

问题核心

你在使用 Tailwind CSS 复刻环形进度条组件时,无法将 Django 视图传递的 average_rate=4.5 赋值给 JavaScript 中的 percent 变量,导致进度条无法正常渲染。

解决方案

1. 视图层预处理百分比

在视图中将评分转换为百分比(假设是5分制),直接传递给模板,减少模板层计算:

class RatePage(TemplateView):
    template_name = "tailwind/rate-page.html"
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        average_rate = 4.5
        # 将5分制评分转换为百分比
        context['progress_percent'] = (average_rate / 5) * 100
        context['average_rate'] = average_rate
        return context

2. 模板层修改:原生 JavaScript 实现进度条

移除原组件中的 Vue/Alpine 绑定语法,改用原生 JS 动态设置进度条属性,同时正确获取 Django 传递的变量:

<div class="flex flex-col relative">
  Score
  <svg class="w-20 h-20">
    <!-- 灰色背景圆环 -->
    <circle
      class="text-gray-300"
      stroke-width="5"
      stroke="currentColor"
      fill="transparent"
      r="30"
      cx="40"
      cy="40"
    />
    <!-- 蓝色进度圆环 -->
    <circle
      id="progress-bar"
      class="text-blue-600"
      stroke-width="5"
      stroke-linecap="round"
      stroke="currentColor"
      fill="transparent"
      r="30"
      cx="40"
      cy="40"
    />
  </svg>
  <!-- 居中显示评分 -->
  <span class="absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 text-xl text-blue-700">
    {{ average_rate }}
  </span>
</div>

<script>
  // 直接通过 Django 模板变量获取百分比值
  const percent = {{ progress_percent }};
  const circumference = 2 * Math.PI * 30;
  const progressBar = document.getElementById('progress-bar');
  
  // 设置进度条的 dash 属性
  progressBar.style.strokeDasharray = circumference;
  progressBar.style.strokeDashoffset = circumference - (percent / 100) * circumference;
</script>

3. 可选:使用 Alpine.js 简化绑定(若已引入)

如果你的项目已使用 Alpine.js,可以保留组件的绑定语法,直接将 Django 变量注入 Alpine 的数据中:

<!-- 确保已引入 Alpine.js -->
<script src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>

<div class="flex flex-col relative" 
     x-data="{ percent: {{ progress_percent }}, circumference: 2 * Math.PI * 30 }">
  Score
  <svg class="w-20 h-20">
    <circle
      class="text-gray-300"
      stroke-width="5"
      stroke="currentColor"
      fill="transparent"
      r="30"
      cx="40"
      cy="40"
    />
    <circle
      class="text-blue-600"
      stroke-width="5"
      :stroke-dasharray="circumference"
      :stroke-dashoffset="circumference - percent / 100 * circumference"
      stroke-linecap="round"
      stroke="currentColor"
      fill="transparent"
      r="30"
      cx="40"
      cy="40"
    />
  </svg>
  <span class="absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 text-xl text-blue-700" 
        x-text="{{ average_rate }}"></span>
</div>

关键说明

  • Django 模板渲染时会直接替换 {{ 变量名 }} 为对应数值,因此可以直接在 JavaScript 或 HTML 属性中使用。
  • 若评分不是5分制,只需调整视图中 progress_percent 的计算逻辑即可。
  • 原生 JS 方案无需额外依赖,兼容性更好;Alpine.js 方案代码更简洁,但需要确保项目已引入该库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:20:28