如果声明总是True J​​inja2模板

时间:2016-08-17 21:35:27

标签: python model-view-controller flask jinja2 backend

我不确定究竟是什么问题,但概念是当我的函数执行它时应该从数据库中获取查询列表,如果它不包含任何对象,它应该返回False而else部分应该执行

第一部分有效,但即使我的数据库为空,也会传递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)

1 个答案:

答案 0 :(得分:1)

问题是查询是懒惰的,即在您开始迭代之前它不会执行。因此,在您测试其真实性时,它不知道有多少记录在其中。默认情况下,Python中的大多数对象都是真实的,这也适用于查询。

要解决此问题,请使用:

return Bookmark.query.order_by(desc(Bookmark.date)).limit(num).all()

.all()执行查询并将结果放入列表中。当它们是空的时,列表是虚假的。由于这是一个小查询,因此将结果同时存储在内存中的缺点很小。