【问题标题】:Extracting fields from a database using Flask and jinja2使用 Flask 和 jinja2 从数据库中提取字段
【发布时间】:2018-03-27 17:58:50
【问题描述】:

我正在 Pythonanywhere 中开发我的代码。我正在尝试修改和扩展课程中的一些代码。

我正在修改从数据库中打印记录的代码,以便从每条记录中提取特定字段值,然后在数据库中找到该字段的所有值的最大值。

我在 flask_app.py 中复制并重命名了以下代码,它只是从数据库中获取所有记录

@app.route('/listmaxidv2')
def listmaxidv2():
with sqlite3.connect("MyFilms2.db") as conn:
    cursor = conn.cursor()
    sql = """SELECT * FROM tblFilms"""
    cursor.execute(sql)
    rows = cursor.fetchall()
    return render_template("/listmaxidv2.html", rows=rows)

然后在呈现的 listmaxidv2.html 模板中,我试图隔离第一个字段的每个值。我已经尝试了很多东西,我的最后一次尝试如下,但我不确定 javascript 是否正在执行(是的,它有点乱)。这是否有明显的迹象表明为什么我没有得到记录中的第一个字段?

<!doctype html>

<html>

<link rel="stylesheet" href="static/filmv2.css">
<script>
function getids(in_var){

if (isNaN(in_var)){

var ret_val = "invalid film id" + in_var;
}
else{
var ret_val = "Valid film id" + in_var;
}
return ret_val;
}
var func_ret = 0
{% for row in rows %}

func_ret =  getids({{row[0]}});
document.getElementById("id_fdbk").innerHTML = func_ret;
func_ret;
{% endfor %}
document.getElementById("testHTML").innerHTML = "Test text to HTML id";

</script>

<body>

<h1> Find maximum film ID </h1>
<h2> Generate next free film ID </h2>
<input type='button' value='Go' onclick='getids(017)';'>
<p id="id_fdbk"></p>
<p id="testHTML"></p>


</body>

</html>

【问题讨论】:

    标签: flask jinja2


    【解决方案1】:

    您误解了 Jinja 的工作方式...... Python 库中的 Jinja,因此,它执行 服务器端,而 javascript 代码执行 客户端,所以你不能将两者混合在一起,就像您在这里尝试做的那样......

    好消息是您可以像这样简单地对此进行调整...

    <!doctype html>
    
    <html>
    
    <link rel="stylesheet" href="static/filmv2.css">
    <script>
    
        var raw_data = {{ rows|tojson }};
    
        function getids(in_var){
            return isNaN(in_var) ? "invalid film id" + in_var : "Valid film id" + in_var;
        }
        var func_ret = 0
    
        raw_data.forEach(function(row) {
            func_ret =  getids(row);
            document.getElementById("id_fdbk").innerHTML = func_ret;
        });
    
        document.getElementById("testHTML").innerHTML = "Test text to HTML id";
    
    </script>
    
    <body>
    
    <h1> Find maximum film ID </h1>
    <h2> Generate next free film ID </h2>
    <input type='button' value='Go' onclick='getids(017)';'>
    <p id="id_fdbk"></p>
    <p id="testHTML"></p>
    
    
    </body>
    
    </html>
    

    我无法完全弄清楚您在上面要做什么。例如。此代码将覆盖列表中每个项目的相同 HTML 元素。我怀疑你只是想让一些东西工作......

    通过使用 Jinja 的 tojson 过滤器,您可以告诉 Jinja 将此信息传递到您的模板中,以便 javascript 可以将其用作本机对象。

    请注意,如果您使用的是 Flask ,您还需要 safe 过滤器,就像上面链接的文档中显示的那样。 (即var raw_data = {{ rows|tojson|safe }};

    【讨论】:

    • 你好。感谢您的帮助。是的,你说得对,我只是想让一些东西起作用,所以我知道它是如何工作的。我不明白服务器端代码与在浏览器客户端中运行的 javascript 的这种分离。我想相对于我对组件如何交互的有限理解,我试图在我能走路之前运行。
    • 其实是一个很常见的问题,所以我不会觉得太糟糕!我认为它的方式是 Jinja 的东西发生在浏览器接收页面之前......如果你点击“查看源代码”,你会在浏览器中看到这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    相关资源
    最近更新 更多