Python 烧瓶-未定义错误:';餐厅id';是未定义的
我试图引用本页的另一页Python 烧瓶-未定义错误:';餐厅id';是未定义的,python,flask,url-routing,function,Python,Flask,Url Routing,Function,我试图引用本页的另一页 <html> <head> </head> <body> <header> <h1>Restaurants<h1> </header> {% for i in restaurants %} <h5> &
<html>
<head>
</head>
<body>
<header>
<h1>Restaurants<h1>
</header>
{% for i in restaurants %}
<h5>
<a href= "*">
{{i.name}}
</a>
   
<a href = "*"> Edit </a>  
<a href = "*"> Delete </a>
</h5>
{% endfor %}
<a href = {{url_for('newRestaurant', restaurant_id = restaurant_id)}}> Create new restaurant </a>
</body>
</html>
在jinja模板中,您不向餐厅id发送任何内容:
{{url_for('newRestaurant', restaurant_id = restaurant_id)}}
第二个餐厅id
没有定义,因为您没有通过它向模板发送任何值
您应该从新餐厅
功能发送一个号码
例如(这只是一个简单的示例),您可以验证餐厅表中是否没有行,如果没有行,则启动餐厅id=1
:
已编辑
@app.route('/restaurant/<int:restaurant_id>', methods = ['GET','POST'])
def newRestaurant(restaurant_id):
if request.method == 'POST':
.............
else:
restaurants = session.query(Restaurant).all()
if not restaurants:
restaurant_id = 1
else:
nr_restaurants = session.query(Restaurant).count()
restaurant_id = int(nr_restaurants) + 1
return render_template('newRestaurant.html', restaurant_id = restaurant_id)
@app.route('/restaurant/',方法=['GET','POST'])
def新餐厅(餐厅id):
如果request.method==“POST”:
.............
其他:
餐厅=session.query(餐厅).all()
如果不是餐馆:
餐厅id=1
其他:
nr_restaurants=session.query(Restaurant.count)()
餐厅id=int(北餐厅)+1
返回呈现模板('newRestaurant.html',restaurant\u id=restaurant\u id)
现在,您正在通过
餐厅id
变量向模板发送一个数字,您可以在那里使用它。我解决了这个问题,下面是如何解决的
考虑到我只需要创建一家新餐厅,我不需要在url上获取餐厅的id。因此,我们应该这样做
@app.route('/restaurant//new',methods=['GET','POST'])
我删除了id部分,并删除了def newRestaurant函数中的参数,如下所示
@app.route('/restaurant/new',methods=['GET','POST'])
非常感谢大家,在我的
deleteMenuItem
定义下添加restaurant\u id=restaurant\u id
时提供了一些线索
请尝试正确设置格式(键入时检查预览区域)。如果你的帖子很难阅读,你就不会得到答案。我现在会帮你解决这个问题。你能提供重新创建错误的步骤吗。据我所知,Jinja2模板的视图不知道餐厅id是什么,我需要粘贴整个webserver.py,你希望我如何将其发送给你,还是ypu有办法让我分享我的建议我仔细地遵循了你的建议并理解了它。非常感谢你。执行后,我仍然得到同样的错误(UndefinedError:“餐厅id”未定义)编辑:您编写了
POS
,而不是POST
,并且我从路线中删除了/new
。试试看。您还应该将模板页面的代码与发送POST
的表单放在一起。呈现模板的功能是render\u template
而不是render
。对不起,我不明白您所说的“将模板页面的代码与发送POST的表单放在一起”是什么意思.APOST
请求通常通过表单的方法
属性从表单发送。你应该读一下。
{{url_for('newRestaurant', restaurant_id = restaurant_id)}}
@app.route('/restaurant/<int:restaurant_id>', methods = ['GET','POST'])
def newRestaurant(restaurant_id):
if request.method == 'POST':
.............
else:
restaurants = session.query(Restaurant).all()
if not restaurants:
restaurant_id = 1
else:
nr_restaurants = session.query(Restaurant).count()
restaurant_id = int(nr_restaurants) + 1
return render_template('newRestaurant.html', restaurant_id = restaurant_id)