渲染Django模板时出现“Uncaught SyntaxError: Unexpected token &”错误

4
我正在尝试使用“https://www.google.com/jsapi”绘制折线图,并从Django视图中传递数据;
这是我的模板。
<head>
    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript">
      google.load("visualization", "1", {packages:["corechart"]});
      google.setOnLoadCallback(drawChart);

      function drawChart() {

        data = {{analytics_data}}
        var data = google.visualization.arrayToDataTable(data);

        var options = {
          title: 'Facebook Analytics'
        };

        var chart = new google.visualization.LineChart(document.getElementById('chart_div'));

        chart.draw(data, options);
      }
    </script>
  </head>
  <body>
       <div id="chart_div" style="width: 900px; height: 500px;"></div>
  </body>
</html>

views.py

def show_fb_analytics(request):
     analytics_data = [["Day", "Likes", "Share", "Comments"]]
     data = FbAnalytics.objects.all()
     for item in data:
        date = item.date
            likes = item.likes
            comments = item.comments
            shares = item.shares
            lst = [date, likes, comments, shares]
            analytics_data.append(lst)

     return render(request, 'fbchart.html', {'analytics_data':analytics_data})

"

analytics_data应以以下格式返回数据:

"
[['Day', 'Likes', 'Share', 'Comments'],
 ['31 Aug',  5,      8,    10         ],
 ['01 Sep',  10,      5,    13         ]]

但是在HTML模板渲染期间,它会按照给定的格式提供数据。
[[&#39;Day&#39;, &#39;Likes&#39;, &#39;Share&#39;, &#39;Comments&#39;], 
  [u&#39;01Sep&#39;, 2, 2, 2]]

这意味着它在每个字符串中添加了u'&amp;#39,导致我收到错误"Uncaught Syntax Error: Unexpected token &",我的模板没有返回折线图。我该如何消除这个错误?
2个回答

9
你应该首先将列表转换为正确的JSON格式,例如:
import json

def show_fb_analytics(request):
    ...
    return render(request, 'fbchart.html', {'analytics_data': json.dumps(analytics_data)})

然后使用“safe”过滤器输出,这样Django的转义引擎就不会干预:

{{analytics_data|safe}}

将列表转换为JSON后,输出的将是JavaScript数组字面量(而不是Python列表字面量;虽然两者非常相似,但实际上它们是不同的,在您的情况下,Python具有JS没有的前缀等),使用safe过滤器将防止Django模板引擎将'转换为&#39;

谢谢Vasily,我已将我的列表转换为正确的JSON格式,但是我仍然收到相同的错误。现在,在呈现过程中,“&quot”被添加到“&#39”的位置。 - Vishnukant Tripathi

1

@Spc_555的答案是正确的,但您也可以在视图中将JSON标记为安全:

import json

from django.utils.safestring import marksafe

def show_fb_analytics(request):
    ...
    return render(request, 'fbchart.html', {'analytics_data': mark_safe(json.dumps(analytics_data))})


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接