2017-02-16 17 views
1

У меня возникли проблемы с выяснением, где моя функция editMenuItem() получает аргумент неизвестного ключевого слова restaurant_id. Я просматривал похожие вопросы и не могу найти решение. Если у кого-то есть предложения, я бы очень признателен им.Тип Ошибка:() получил неожиданный аргумент ключевого слова

Traceback (most recent call last): 
    File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
TypeError: editMenuItem() got an unexpected keyword argument 'restaurant_id' 

editMenuItem()

### Edit a menu item. ### 
@app.route('/restaurant/<int:restaurant_id>/menu/<int:menuitem_id>/edit/', 
      methods=['GET', 'POST']) 
def editMenuItem(menuitem_id): 
    menuitem = session.query(MenuItem).filter_by(id=menuitem_id).one() 
    if request.method == 'POST': 
     if request.form['newname']: 
      menuitem.name = request.form['newname'] 
     if request.form['newdescription']: 
      menuitem.description = request.form['newdescription'] 
     if request.form['newprice']: 
      menuitem.description = request.form['newprice'] 
     session.add(menuitem) 
     session.commit() 
     return redirect(url_for('showMenu', restaurant_id=menuitem.restaurant_id)) 
    else: 
     return render_template('editMenuItem.html', menuitem=menuitem) 

Relevant html

{% extends "base.html" %} 
{% block content %} 
<div class="row"> 
    <div class="six columns"> 
    <form action="{{ url_for('editMenuItem', menuitem_id = menuitem.id) }}" method="post"> 
     <div class="six columns"> 
     <div class="six columns"> 
      Menu Item ID : {{ menuitem.id }} 
      <br> 
      Menu Item Name : {{ menuitem.name }} 
      <br> 
      Menu Item Description : {{ menuitem.description }} 
      <br> 
      Menu ITem Price : {{ menuitem.price }} 
      <br> 
     </div> 
     <br> 
     <div class="six columns"> 
      <div class="six columns"> 
      <label for="newItemName">New item name</label> 
      <input type="text" id="newname" class="form" name="newname" placeholder="Enter new name here"> 
      <br> 
      </div> 
      <div class="six columns"> 
      <label for="newItemDescription">New item Description</label> 
      <input type="text" id="newdescription" class="form" name="newdescription" placeholder="Enter new description here"> 
      <br> 
      </div> 
      <div class="six columns"> 
      <label for="newItemPrice">New item Price</label> 
      <input type="text" id="newprice" class="form" name="newprice" placeholder="Enter new price here"> 
      <br> 
      </div> 
     </div> 
     <div class="six columns"> 
      <button type="submit" class="button">Edit</button> 
      <a href="{{ url_for('showMenu') }}" class="button">Cancel</a> 
      <br> 
     </div> 
     </div> 
    </form> 
    </div> 
</div> 
{% endblock %} 

Я не уверен, где это ключевое слово аргумент исходит из как restaurant_id не должно быть необходимым, чтобы дать для того, чтобы моя функция к Работа. Что я здесь делаю неправильно? Спасибо.

+2

Откуда появляется 'menuitem_id'? Подсказка: это то же самое для 'restaurant_id'. – Wombatz

+0

Единственное, что я вижу, это url, используемый для моего '@ app.route'. Будет ли это, где моя функция выводит аргумент? – NoOrangeJuice

ответ

1

Благодаря подсказке Wombatz я смог решить проблему, изменив функцию editMenuItem и изменив необходимый шаблон.

Обновлено функция:

### Edit a menu item. ### 
@app.route('/restaurant/<int:restaurant_id>/menu/<int:menuitem_id>/edit/', 
      methods=['GET', 'POST']) 
def editMenuItem(menuitem_id, restaurant_id): 
    menuitem = session.query(MenuItem).filter_by(id=menuitem_id).one() 
    restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 
    if request.method == 'POST': 
     if request.form['newname']: 
      menuitem.name = request.form['newname'] 
     if request.form['newdescription']: 
      menuitem.description = request.form['newdescription'] 
     if request.form['newprice']: 
      menuitem.description = request.form['newprice'] 
     session.add(menuitem) 
     session.commit() 
     return redirect(url_for('showMenu', restaurant_id=menuitem.restaurant_id)) 
    else: 
     return render_template('editMenuItem.html', menuitem=menuitem, restaurant=restaurant) 

Обновленный шаблон:

<form action="{{ url_for('editMenuItem', menuitem_id = menuitem.id, restaurant_id = restaurant.id) }}" method="post"> 

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

Я новичок в использовании этого сайта, так что я не уверен, что могу «upvote» ваш комментарий Wombatz, но благодаря для подсказки.