【问题标题】:Looping over a list in a Jinja2 template在 Jinja2 模板中循环列表
【发布时间】:2012-11-13 03:50:59
【问题描述】:

我正在尝试使用 Flask 框架制作一个简单的博客网站。我博客中的每个条目都有一个标题、文本和 cmets。标题和文本存储在名为 entries 的表中,而 cmets 存储在名为 cmets 的表中,该表使用外键将 cmets 链接到相应的条目。

我现在遇到的问题是我想在我的 html 文件中显示 cmets。要做的是,当我处于 for 循环中时,我想在我的 html 文件中调用一个名为 show_cmets 的 python 函数。 python函数如下所示:

@app.route('/comments/<entryid>')
def show_comments(entryid):
    db = get_db()
    curId = db.execute('select id, comment from comments where entry_id=entryid order by     id desc')
    comments = [dict(id=row[0], comment=row[1]) for row in curId.fetchall()]
    return render_template('show_entries.html', comments=comments)

我的模板如下所示:

% extends "layout.html" %}
{% block body %}
  {% if session.logged_in %}
    <form action="{{ url_for('add_entry') }}" method=post class=add-entry>
      <dl>
    <dt>Title:
    <dd><input type=text size=30 name=title>
    <dt>Text:
    <dd><textarea name=text rows=5 cols=40></textarea>  
    <dd><input type=submit value=Share>
  </dl>
</form>
  {% endif %}
  <ul class=entries>
  {% for entry in entries %}
    <li><h2>{{ entry.title }}</h2>{{ entry.text }}
{{ url_for('show_comments', entryid=entry.id) }}
<ul class=comments>
{% for acomment in comments %}
<li>{{ acomment.comment }}
</li>
</br>
</ul>
{% endfor %}
{% if session.logged_in %}
<form action="{{ url_for('add_comment', key=entry.id) }}" method=post class=add-entry>
<dl>
    <dt>Comment:
    <dd><textarea name=comment rows=2 cols=40></textarea>
    <dd><input type=submit value=Comment>
  </dl>
</form>
{% endif %}
  {% else %}
    <li><em>Unbelievable.  No entries here so far</em>
  {% endfor %}
  </ul>
{% endblock %}

【问题讨论】:

  • 首先这不是 HTML。那是一个 HTML 模板。特别是它看起来像的 Jinja2 模板。而且你没有在模板中调用任何 Python 函数,你只是在循环一个 cmets 列表。尽管我可以告诉您,您的模板中有很多错误,但您还没有确切地告诉我们您遇到了什么问题。
  • 我应该补充一下——您似乎对 Flask(以及一般的 Web 框架)的工作方式有误解。模板不调用您的 show_cmets 函数。 Web 框架调用它来生成对 /cmets/ URL 的 HTTP 请求的响应。然后,该函数将某些数据库查询的结果推送到呈现模板时使用的列表中。在某种意义上 show_cmets “调用”(实际上是渲染)HTML 模板,而不是相反。
  • 您向我们展示了您的尝试,值得称赞。但究竟是什么问题?

标签: python html jinja2


【解决方案1】:

您还没有真正告诉我们您的问题是什么,所以我不知道这是否会有所帮助。但我会在这里指出三个具体错误:

首先是您将 cmets 放入无序列表(&lt;ul&gt; 标签),但您将结束标签(&lt;/ul&gt;)放入循环内部而不是外部。

&lt;/br&gt; 应该写成&lt;br /&gt;,但实际上这个标签一开始就不属于那里。

其次,您的 HTML 已损坏。 HTML 属性(标签中的部分,如type=submit)应该在值周围加上引号。例如,它应该看起来像type="submit"。大多数浏览器对此类事情都宽容,但最好不要指望这一点并编写正确的 HTML。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多