2017-02-16 12 views
0

как заголовок говорит, что я получаю код ошибки при попытке сделать одну из моих страниц веб-сайта.jinja2.exceptions.UndefinedError Как определить «ресторан»

Вот части TRACEBACK, которые указывают на мой код:

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 

Как вы можете видеть, что это говорит мне, что «ресторан» не определен, сначала я думал, что, возможно, я не был правильно запросив мою базу данных, поэтому я дважды проверил этот раздел моего кода, и я не могу найти никаких проблем.

Вот мой питон модуль и соответствующий 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) 

и вот HTML файл newMenuItem:

{% 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 для создания нового ресторана. Единственное, что я мог подумать, это вызвало бы эту проблему: мой шаблон не может определить идентификатор ресторана, где должен быть создан новый пункт меню. Я не уверен, как читать этот код ошибки, поскольку я не знаю, говорит ли он, что «ресторан» как переменная неопределен или что «ресторан» не определен в том смысле, что мой код не может назвать правильный идентификатор.

Любые предложения? Заранее спасибо за любую помощь.

ответ

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.

+0

Это решение. Спасибо за быстрый ответ! Это мой первый вопрос о stackoverflow, он говорит мне, что я должен подождать 8 минут, чтобы пометить вопрос так, как он решил, поэтому я сделаю это через несколько минут, – NoOrangeJuice

0

Переменный ресторан имеет неправильное название!

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