如何将mongodb返回的值传递给javascript数组?

时间:2019-04-10 03:26:48

标签: javascript arrays mongodb flask pymongo

我正在使用flask渲染html模板。我想将pymongo查询返回的所有项目存储到Java脚本数组中。我创建了一个数组c [],该数组首先为空。并且我使用flask循环来遍历pymongo查询返回的项目,我将其推到数组c。

我尝试了一些stackoverflow的答案,但这与我对问题的理解并不相符

我的html代码在这里:home.html

<html>
    <head>
        <title>ii</title>
  </head>
<script>
var c=[]
{% for todo in collection %}
c.push{{todo["q"]}};
{% endfor %}

</script>
</body>
</html>

我的烧瓶文件:-

from flask import Flask, render_template,json
from pymongo import MongoClient
from bson import json_util,ObjectId

app = Flask(__name__) 
mongo_object = MongoClient("localhost", 27017)
app.debug= True
db = mongo_object['test']
collection = db['myc']
@app.route('/')
def index():
    return render_template('home.html')


@app.route('/find',methods=['GET', 'POST']) 
def pymongo_data_display():
    my_data = collection.find()
    a1="active"
    return render_template('home.html',a1=a1,collection=my_data,t="hi",h="hoho")
    '''
    if not my_data:
        return 'no data'
    else:        
        return my_data
    '''

if __name__ == '__main__': 
        app.run()

it gives nothing.But can anyone suggest what to do here?

2 个答案:

答案 0 :(得分:1)

有几件事:

  1. 您将my_data提供给render_template的地方是非空的吗?数据的结构是什么?
  2. 模板中todo["q"]的值是什么?是数字还是字符串?如果是后者,则在将其放入JavaScript数组之前,需要将其用引号引起来。
  3. 您在c.push{{todo["q"]}};中缺少括号。

假设您需要将字符串列表存储在JavaScript数组中(即,需要先引用值,然后再将其压入数组)。然后,您需要定义自定义过滤器以实现此目的。这是完整的示例:

import jinja2                                                                   

def quote(value):                                                               
    return '"{}"'.format(value)                                                 

env = jinja2.Environment()                                                      
env.filters['quote'] = quote                                                    


template = env.from_string("""                                                  
<script>                                                                        
var c = [];                                                                     
{% for item in data %}                                                          
    c.push({{ item.q|quote|safe }});                                            
{% endfor %}                                                                    
</script>                                                                       
""")                                                                            

data = [{'q': 1}, {'q': 2}, {'q': 3}]                                           
print(template.render(data=data))

答案 1 :(得分:1)

这有效:

  

home.html文件:

<html>
<head>
<title>ii</title>
<script>
    function populateMyDiv(){
        var ul=document.createElement('ul');
        {% for name in collection %}
            var li=document.createElement('li');
            ul.appendChild(li);
            li.innerHTML=li.innerHTML + "{{name}}";
        {% endfor %}
        document.getElementById("test").appendChild(ul);
    }
</script>
</head>
<body onload="populateMyDiv()">
    <div id="test"></div>
</body>
</html>
  

test.py文件:

from flask import Flask, render_template
from pymongo import MongoClient
import json
app = Flask(__name__)

mongo_obj=MongoClient("localhost", 27017)


@app.route('/')
def hello_world():
    db = mongo_obj['your_database']
    collection = db['your_collection']
    temp = collection.find()
    my_data = []
    for x in temp:
        my_data.append(x['name'])
    return render_template('home.html',collection=my_data)