在GAE中将Django模板变量传递到javascript中

2024-05-23 15:02:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用谷歌的可视化示例创建一个词云:

<link rel="stylesheet" type="text/css" href="http://visapi-gadgets.googlecode.com/svn/trunk/wordcloud/wc.css"/>
<script type="text/javascript" src="http://visapi-gadgets.googlecode.com/svn/trunk/wordcloud/wc.js"></script>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>


<div id="wcdiv"></div>
<script type="text/javascript">
  google.load("visualization", "1");
  google.setOnLoadCallback(draw);
  function draw() {
    var data = new google.visualization.DataTable();
    data.addColumn('string', 'Text1');
    data.addRows(160);
 {{datamade}}
    var outputDiv = document.getElementById('wcdiv');
    var wc = new WordCloud(outputDiv);
    wc.draw(data, null);
  }
</script>

我正在我的主.py文件,然后将其作为模板变量传递:

^{pr2}$

当我打印{datamaked}}时,我看到了正确的Javascript代码。当我把这些值硬编码到状态页.html,javascript正确执行。但是当我将变量直接传递到javascript中时,javascript不能正确执行。在

我的javascript是在模板值被传递之前执行的吗?不知道该如何调整。如果有什么建议,我将不胜感激。在

免责声明:我完全是个新手。在

谢谢你! 杰克


Tags: textcomhttpdatavartypegooglescript
2条回答

你好像把标签放进你的手边了datamade'可以是:

data.setCell('foo', 0, 'bar');<br>data.setCell('foo', 0, 'bar');

这不是可执行的js,因为js解释器无法读取html标记。实际上,您正在编写一个不完整的比较表达式(没有比一个名为br的变量小的东西)。不必费心在代码中插入分页符,只需在空字符串上联接即可。datamade = ''.join(datamake)

编辑: 不过,一般来说,使用循环打印出100多行js并不是一个好的实践。最好将整个对象以json格式发送到js,然后在客户机中循环。在

我建议:

<link rel="stylesheet" type="text/css" href="http://visapi-gadgets.googlecode.com/svn/trunk/wordcloud/wc.css"/>
<script type="text/javascript" src="http://visapi-gadgets.googlecode.com/svn/trunk/wordcloud/wc.js"></script>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>


<div id="wcdiv"></div>
<script type="text/javascript">
  google.load("visualization", "1");
  google.setOnLoadCallback(draw);
  function draw() {
    var data = new google.visualization.DataTable();
    data.addColumn('string', 'Text1');
    data.addRows(160);
    var tweets = {{tweets}};

    for (var i in tweets) {
       data.setCell(i, 0, tweets[i]);
    }

    var outputDiv = document.getElementById('wcdiv');
    var wc = new WordCloud(outputDiv);
    wc.draw(data, null);
  }
</script>

服务器文件是否显示以下内容:

^{pr2}$

我建议您对代码进行一些更改。而不是生成javascript调用(数据集单元格),生成表并让Google DataTable处理它。在

import os
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext.webapp import template
from google.appengine.api import urlfetch

class GetTweetsHandler(webapp.RequestHandler):
    def get(self):
        user = self.request.get('user', 'someuser')
        fetched = urlfetch.fetch("http://api.twitter.com/1/statuses/user_timeline.json"
                                 "?screen_name=" + user + "&count=200")
        tweets = json.loads(fetched.content)

        data = {'cols': [{'type': 'string', 'label': 'Tweets'}],
                'rows': [{'c': [{'v': tweet["text"]}]} for tweet in tweets]}

        template_values = {'tweet_data': json.dumps(data),
                           'user': user}
        path = os.path.join(os.path.dirname(__file__), 'index.html')
        self.response.out.write(template.render(path, template_values))


 def main():
   application = webapp.WSGIApplication([('/gettweets', GetTweetsHandler)],
                                        debug=True)
   run_wsgi_app(application)

 if __name__ == '__main__':
   main()

因此,您只需要将生成的datatable传递到Google的datatable。幸运的是,这只是对模板的一个很小的更改:

^{pr2}$

通过转到http://localhost:8080/gettweets/someuser调用它

相关问题 更多 >