如何使用 construct_homepage_panels 挂钩将 Chart.js 添加到 Wagtail 主页面板?

How to add Chart.js to Wagtail Homepage panels using construct_homepage_panels hook?

我正在修改我的 Wagtail 应用程序的主仪表板以提供更多 useful/relevant 数据,例如未结工作订单的数量或客户数量。

我在让 Chart.js 显示在我的仪表板中时遇到了一些问题。我已确认资源 chart.js(版本 2.8.0)正在加载,我的 canvas 元素也已加载到页面上。不过,图表不会显示。

这是一些代码。这些都在我的 'dashboard' 应用程序中。

wagtail_hooks.py

class WelcomePanel:
    order = 5000

    def __init__(self, request):
        self.request = request
        self.logged_in_user = request.user.username

    def render(self):
        return render_to_string('wagtailadmin/dashboard.html', {
            'logged_in_user': self.logged_in_user,
        }, request=self.request)

# simply pass the 'request' to the panel
@hooks.register('construct_homepage_panels')
def add_another_welcome_panel(request, panels):
    panels.append(WelcomePanel(request))

templates/wagtailadmin/dashboard.html

{% load static %}

<h1> This text is visible </h1>
<canvas id="pie_chart" height="604" width="1210" style="display: block; width: 605px; height: 302px;"></canvas>

<script src="{% static 'js/chart.js' %}" type="text/javascript"><script>

<script tyle="text/javascript">
var stars = [135850, 52122, 148825, 16939, 9763];
var frameworks = ["React", "Angular", "Vue", "Hyperapp", "Omi"];

document.addEventListener('DOMContentLoaded', function() {
  var ctx = document.getElementById("pie_chart").getContext('2d');
  var myChart = new Chart(ctx, {
  type: "pie",
  data: {
    labels: frameworks,
    datasets: [
      {
        label: "Github Stars",
        data: stars,
        backgroundColor: [
          "rgba(255, 99, 132, 0.2)",
          "rgba(54, 162, 235, 0.2)",
          "rgba(255, 206, 86, 0.2)",
          "rgba(75, 192, 192, 0.2)",
          "rgba(153, 102, 255, 0.2)"
        ],
        borderColor: [
          "rgba(255, 99, 132, 1)",
          "rgba(54, 162, 235, 1)",
          "rgba(255, 206, 86, 1)",
          "rgba(75, 192, 192, 1)",
          "rgba(153, 102, 255, 1)",
        ],
        borderWidth: 1
      }
    ]
  }
});
}, false);
</script>

编辑 我已经尝试设置 async defer 以及事件侦听器以仅在 DOM 完全加载 DOMContentLoaded.

时执行图表创建

我在本地没有 运行 此代码,只是一个快速建议 - 您可能需要等到 DOM 在 运行 加载 getElementById 之前加载,并且new Chart 部分。

这是因为在页面完全呈现之前,文档查询return什么也不会。

<script tyle="text/javascript">
// note: you can set up your stars/frameworks and other data outside of the callback below
// the key thing is that the DOM writing and dom query (getElementById) are inside the callback

document.addEventListener('DOMContentLoaded', function() {

   var ctx = document.getElementById("pie_chart");
   var myChart = new Chart( /* ... code here */);

}, false);

</script>

您可以在此处阅读更多相关信息:https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContentLoaded_event

这里也有一个问题