If 语句始终为真 Jinja2 模板
If statement always True Jinja2 Template
我不确定到底是什么问题,但概念是当我的函数执行时它应该从数据库中获取一个查询列表,如果它不包含任何对象它应该 return False 和其他部分应该执行
第一部分有效,但即使我的数据库为空,它也通过了 True,
{% if new_bookmarks %}
<div id='newBookmarks'>
{% for bm in new_bookmarks %}
<a href='{{ bm.url }}'><span>{{ bm.user.username }}</span>
Added: {{ bm.url }} <span>{{ bm.description }}</span></a>
{% endfor %}
</div>
{% else %}
<div>
Something else
</div>
{% endif %}
@app.route('/')
@app.route('/index')
def index():
return render_template('index.html', new_bookmarks=Bookmark.newest(5))
class Bookmark(db.Model):
id = db.Column(db.Integer, primary_key=True)
url = db.Column(db.Text, nullable=False)
date = db.Column(db.DateTime, default=datetime.utcnow)
description = db.Column(db.String(300))
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
@staticmethod
def newest(num):
return Bookmark.query.order_by(desc(Bookmark.date)).limit(num)
问题是查询是惰性的,即,直到您开始迭代它才会执行。因此,在您测试其真实性时,它不知道其中有多少条记录。默认情况下,Python 中的大多数对象都是真实的,这也适用于查询。
要解决此问题,请使用:
return Bookmark.query.order_by(desc(Bookmark.date)).limit(num).all()
.all()
执行查询并将结果放入列表中。列表为空时是虚假的。由于这是一个小查询,因此一次性将所有结果存入内存的缺点很小。
我不确定到底是什么问题,但概念是当我的函数执行时它应该从数据库中获取一个查询列表,如果它不包含任何对象它应该 return False 和其他部分应该执行
第一部分有效,但即使我的数据库为空,它也通过了 True,
{% if new_bookmarks %}
<div id='newBookmarks'>
{% for bm in new_bookmarks %}
<a href='{{ bm.url }}'><span>{{ bm.user.username }}</span>
Added: {{ bm.url }} <span>{{ bm.description }}</span></a>
{% endfor %}
</div>
{% else %}
<div>
Something else
</div>
{% endif %}
@app.route('/')
@app.route('/index')
def index():
return render_template('index.html', new_bookmarks=Bookmark.newest(5))
class Bookmark(db.Model):
id = db.Column(db.Integer, primary_key=True)
url = db.Column(db.Text, nullable=False)
date = db.Column(db.DateTime, default=datetime.utcnow)
description = db.Column(db.String(300))
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
@staticmethod
def newest(num):
return Bookmark.query.order_by(desc(Bookmark.date)).limit(num)
问题是查询是惰性的,即,直到您开始迭代它才会执行。因此,在您测试其真实性时,它不知道其中有多少条记录。默认情况下,Python 中的大多数对象都是真实的,这也适用于查询。
要解决此问题,请使用:
return Bookmark.query.order_by(desc(Bookmark.date)).limit(num).all()
.all()
执行查询并将结果放入列表中。列表为空时是虚假的。由于这是一个小查询,因此一次性将所有结果存入内存的缺点很小。