没有“with”关键字的TemplateSyntaxError

时间:2016-02-02 10:05:19

标签: python python-2.7 flask sqlalchemy

我正在尝试实施一个简单的餐厅菜单网站,其中显示了餐馆及其菜单项的列表。

newMenuItem是在餐馆中添加新菜单项的功能。 MenuItem是菜单项表,Restaurant是餐馆的表格,而restaurantmenu是仅显示餐馆菜单项列表的功能。

@app.route('/restaurants/<int:restaurant_id>/new', methods = ['GET', 'POST'])
def newMenuItem(restaurant_id):
    if request.method == 'POST':
        newItem = MenuItem(name = request.form['name'], restaurant_id = restaurant_id)
        session.add(newItem)
        session.commit()
        flash("new menu item created!")
        return redirect(url_for('restaurantmenu', restaurant_id = restaurant_id))
    else:
        return render_template('newmenuitem.html', restaurant_id = restaurant_id)

restaurantmenu功能

@app.route('/restaurants/<int:restaurant_id>/', methods = ['GET', 'POST'])
def restaurantmenu(restaurant_id):
    restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one()
    items = session.query(MenuItem).filter_by(restaurant_id=restaurant.id)
    return render_template('menu.html', restaurant = restaurant, items = items)

menu.html模板显示菜单项列表,这是我尝试显示Flash消息的位置。它的代码是

<html>
<body>
    <h1>{{restaurant.name}}</h1>
    {% with messages = get_flashed_messages() %}
        {% if messages %}
            <ul>
            {% for message in messages %}
                <li>{{message}}</li>
            {% endfor %}
            </ul>
        {% endif %}
    {% endwith %}
    <a href='{{url_for('newMenuItem', restaurant_id = restaurant.id)}}'>Create New Item</a>
    {% for i in items %}
    <div>
        <p>{{i.name}}</p>
        <p>{{i.description}}</p>
        <p> {{i.price}} </p>
        <a href='{{url_for('editMenuItem', restaurant_id = restaurant.id, menu_id = i.id)}}'>Edit</a>
        <a href='{{url_for('deleteMenuItem', restaurant_id = restaurant.id, menu_id = i.id)}}'>Delete</a>
        <br>
    </div>
    {% endfor %}
</body>
</html>

我知道“with”关键字用于清理文件流等资源,但在这种情况下,如果我删除该关键字,则在尝试显示菜单项时会出现TemplateSyntaxError。

TemplateSyntaxError: Encountered unknown tag 'messages'

我不明白“with”关键字是如何使它全部工作的。没有它,不应该将闪存消息数组保存到messages变量中,以便后续的for循环访问吗?

1 个答案:

答案 0 :(得分:1)

没有。这是Jinja2模板语言,而不是Python; with是您定义变量的方式。模板语言中没有直接赋值。