jinja2.exceptions.UndefinedError如何定义' restaurant'

时间:2017-02-16 16:49:57

标签: python templates flask jinja2

正如标题所示,当我尝试渲染我的一个网站页面时,我收到了错误代码。

以下是指向我的代码的回溯部分:

  File "/vagrant/catalog/project.py", line 48, in newMenuItem
    return render_template('newMenuItem.html', restaurant_id=restaurant.id)

  File "/vagrant/catalog/templates/newMenuItem.html", line 9, in block "content"
    <form action="{{ url_for('newMenuItem', restaurant_id=restaurant.id) }}" method="POST">
  File "/usr/lib/python2.7/dist-packages/jinja2/environment.py", line 397, in getattr
    return getattr(obj, attribute)
UndefinedError: 'restaurant' is undefined

正如你所看到的,它告诉我&#39; restaurant&#39;没有定义,起初我想也许我没有正确查询我的数据库所以我仔细检查了我的代码部分,我找不到任何问题。

这是我的python模块和相关的html文件:

### Create new menu item. ###
@app.route('/restaurant/<int:restaurant_id>/menu/new/',
            methods=['GET', 'POST'])
def newMenuItem(restaurant_id):
    restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one()
    if request.method == 'POST':
        newMenuItem = MenuItem(name=request.form['name'],
                               description=request.form['description'],
                               price=request.form['price'],
                               restaurant_id=restaurant.id)
        session.add(newMenuItem)
        session.commit()
        return redirect(url_for('showMenu', restaurant_id=restaurant.id))
    else:
        return render_template('newMenuItem.html', restaurant_id=restaurant.id)

这是newMenuItem html文件:

{% extends "base.html" %}
{% block content %}
<div class="twelve columns">
  New Item.
</div>

<div class="row">
  <div class="six columns">
    <form action="{{ url_for('newMenuItem', restaurant_id=restaurant.id) }}" method="POST">
      <div class="row">
        <div class="six columns">
          <label for="Item Name">Item Name</label>
          <input class="u-full-width" placeholder="New Item" name="name" type="text">
        </div>
        <div class="six columns">
          <label for="Item Name">Item Description</label>
          <input class="u-full-width" placeholder="Description" description="description" type="text">
        </div>
        <div class="six columns">
          <label for="Item Name">Item Price</label>
          <input class="u-full-width" placeholder="Price" price="price" type="text">
        </div>
        <div class="six columns">
          <input class="button" value="Create" type="submit">
          <a class="button" href="{{ url_for('showMenu', restaurant_id=restaurant.id) }}">Cancel</a>
        </div>
      </div>
    </form>
  </div>
</div>
{% endblock %}

我无法理解为什么这个特定页面会抛出此错误,因为我使用了类似的url_for代码来创建一个新的餐馆。我唯一能想到的就是导致这个问题的是我的模板无法弄清楚应该创建新菜单项的餐馆ID。我不确定如何阅读此错误代码,因为我不知道它是否告诉我&#39; restaurant&#39;作为一个变量是未定义的,或者那个&#39; restaurant&#39;在我的代码无法调用正确的id的意义上是未定义的。

有什么建议吗?提前感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:0)

没有restaurant变量传递到模板上下文,上下文中只有restaurant_id。替换:

return render_template('newMenuItem.html', restaurant_id=restaurant.id)

使用:

return render_template('newMenuItem.html', restaurant=restaurant)

或者,如果您只需要模板中的餐馆ID,请保留渲染部分,并通过restaurant_id代替restaurant.id访问ID。

答案 1 :(得分:0)

变量餐厅名称错误!

<a class="button" href="{{ url_for('showMenu', restaurant_id=restaurant_id) }}">Cancel</a>