【问题标题】:How can I render a highcharts solidgauge with Django?如何使用 Django 渲染 highcharts solidgauge?
【发布时间】:2021-07-06 06:45:39
【问题描述】:

我想显示一个 highcharts solidgauge (https://www.highcharts.com/demo/gauge-solid)。对于我的小应用程序,我使用 Django 和 Python3.8。但我发现的大多数示例仅适用于 Angular。

tldr:我从 highcharts(第 17 号)收到一条红色错误消息,指出请求的系列类型不存在。

长话短说:因为我不知道有什么更好的方法,所以我下载了四个 js 文件(https://code.highcharts.com/modules/solid-gauge.jshttps://code.highcharts.com/modules/solid-gauge.src.jshttps://code.highcharts.com/highcharts-more.jshttps://code.highcharts.com/highcharts-more.src.js)。我将它们放在我的 Django 的静态文件夹中并运行 manage.py collectstatic。

在我的views.py 中,我只是尝试复制highcharts 页面中的示例,但我没有得到它来呈现。代码如下所示。

def landingpage(request):        
   chart = {
       'chart': {
           'type':'solidgauge',
       },
       'title': {'text':'Example gauge'},
       'pane': {
           'center': ['50%', '85%'], 'size': '140%', 'startangle': -90, 'endangle':90, 'background': {
               'backgroundcolor': 'Highcharts.defaultOptions.legend.backgroundColor || \'#EE\'', 'innerRadius': '60%', 'outerRadius': '100%', 'shape': 'arc',
           }
       },
       'exporting': {'enabled': False},
       'tooltip': {'enabled': True},
       'yAxis':{'stops': [
               [0.1, '#55BF3B'], # green
               [0.5, '#DDDF0D'], # yellow
               [0.9, '#DF5353'], # red
           ], 'min':0, 'max':200, 'lineWidth': 0, 'tickWidth': 0, 'minorTickInterval': 'null', 'tickAmount': 2, 'title': {
               'y':-70,
               'text': 'Speed'
           }, 'labels': {
               'y':16
           }
       },
       'credits': {
           'enabled': False
       },
       'plotOptions': {
           'solidgauge': {
               'dataLabels': {
                   'useHTML': True,
                   'borderWidth': 0,
                   'y':6,
               }
           }
       },
       'series': [{
           'name': 'Speed', 'data': [80], 'dataLabels': {
               'format': '<div style="text-align:center"><span style="font-size:25px">{y}</span><br/><span style="font-size:12px;opacity:0.4">km/h</span></div>'
           }, 'tooltip': {
               'valueSuffix': ' km/h'
           }
       }]
   }
dump = json.dumps(chart, cls=CustomJsonEncoder)             
gauge = {'chart':dump}
context['chart_example'] = gauge['chart']
return render(request, templ_folder_name + 'landingpage.html', context)

class CustomJsonEncoder(json.JSONEncoder):
   def default(self, obj):
       if isinstance(obj, Decimal):
           return float(obj)
       return super(CustomJsonEncoder, self).default(obj)

在我的模板中我使用这个:

{% block content %}
    <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
            <h2 class="page-header">Dashboard</h2>
        <br>
        <div class="container-fluid">
            <div class="col-sm-6 col-sm-offset-0 col-md-7 col-md-offset-0">
                <div id="hccontainer"></div>
                    <br>
            </div>
            <div class="col-sm-3 col-sm-offset-0 col-md-4 col-md-offset-0">
                TBD
            </div>
        </div>
        <br>
        </div>
    {% load static %}
        <script type="text/javascript" src="{% static 'highcharts/highcharts.src.js' %}"></script>
        <script type="text/javascript" src="{% static 'highcharts/debugger.js' %}"></script>
        <script type="text/javascript" src="{% static 'highcharts/highcharts-more.js' %}"></script>
        <script type="text/javascript" src="{% static 'highcharts/highcharts-more.src.js' %}"></script>
        <script type="text/javascript" src="{% static 'highcharts/solid-gauge.js' %}"></script>
        <script type="text/javascript" src="{% static 'highcharts/solid-gauge.src.js' %}"></script>
<script>
        Highcharts.chart('hccontainer', {{chart_example|safe}});

        </script>

{% endblock %}

你能告诉我我的错误在哪里吗?

更新: 实际上我不知道如何在我的 FF 中使用开发人员工具,但我从它提到的内容中得到了一个截图。

【问题讨论】:

  • 小更新:我现在包含了一个柱形图和一个子弹图(均来自 highcharts)。那些工作正常。只是solidgauge图表,还是说这个找不到。
  • 到目前为止,我发现脚本的顺序包括

标签: javascript django highcharts


【解决方案1】:

至少部分我找到了解决方案,但老实说我并不完全理解它。我尝试了几种包含的组合,其中一种似乎有效(尚待详细测试!)是这样的:

 <script type="text/javascript" src="{% static 'highcharts/highcharts.src.js' %}"></script>
 <script type="text/javascript" src="{% static 'highcharts/modules/bullet.src.js' %}"></script>
    <script type="text/javascript" src="{% static 'highcharts/highcharts-more.js' %}"></script>
    <script>
        Highcharts.chart('hccontainer_chart1', {{var1|safe}});
        </script>
    <script>
        Highcharts.chart('hccontainer_chart2', {{chart2|safe}});
    </script>
    <script type="text/javascript" src="{% static 'highcharts/modules/solid-gauge.js' %}"></script>
    <script>
        Highcharts.chart('hccontainer_chart3', {{chart3|safe}});
    </script>

我仍然感到困惑,因为它必须完全是这个顺序。首先,我想按这个顺序 highcharts -> highcharts-more -> bullet -> solidgauge。此外,我认为如果我使用 .js 或 .src.js 并没有什么区别,但出于某种原因它确实如此。也许有经验的人可以向我解释一下,这样我以后就不会再犯同样的错误了。

谢谢!

【讨论】:

    【解决方案2】:

    我认为它可能会解决您的考虑 - highcharts solidgauge 模块必须在 highcharts-more 模块之后初始化,因为某些属性是从 more 模块继承的。你可以在这个演示中测试它:https://jsfiddle.net/BlackLabel/gqLhm3cr/

    【讨论】:

    • 亲爱的塞巴斯蒂安,谢谢!正如我在下面的另一个答案中提到的,我想出了一个工作顺序,但我仍然不明白为什么在某些情况下我需要 src 文件以及为什么普通的 js 文件不起作用。你知道这是为什么吗?
    • @MDoe 老实说-我不知道-在常规情况下(在没有Django,纯JS的情况下在前面实现Highcharts)不需要使用src文件。我只能猜测使用 Django 会对其产生影响。
    • 好吧,那我只需要忍受它,也许其他人也可以从中受益。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 2021-05-10
    • 2013-04-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    相关资源
    最近更新 更多