【发布时间】:2018-12-30 09:37:37
【问题描述】:
我在做什么的总结和背景:
我正在创建一个应用程序,它允许您添加和存储食谱,并且我希望能够使用每个食谱收到的观看次数来组织我的食谱列表。我应该解释一下,我有一个食谱列表,如果您单击该列表中一个食谱的标题,它将带您进入一个新页面并显示该食谱。这样,我可以将我的应用程序组织成三类列表(早餐、午餐和晚餐)。
我正在使用 MongoDB 来托管我的键/值对 ("views":0) 并且 我希望能够增加每次有人刷新页面时“浏览量”+1。我将在下面提供我的代码,但我认为我的问题是我似乎无法在我的 HTML 或 MongoDB 中增加值。让我解释一下:我几乎可以肯定我的路由代码是正确的。我看过很多关于在 MongoDB 中 $inc 一个值的适当方法的教程,但我相信我的 HTML 中遗漏了一些东西来正确对应该代码,我不确定它是什么是。
当我运行此代码时它仍然有效并且没有错误警告,但是当我进入任何食谱页面时,当我刷新该页面时视图计数器不会改变。它只是保持在 0。
我还应该说我有两条独立的路线,我认为在这种情况下它们彼此相关:我有一个“view_recipe”路线,它显示食谱的页面,我有一个“view_count”路线,它的功能是计算观看次数。我将在下面提供这两个以及我的 HTML 供大家检查。
到目前为止我所做的尝试:
对于我的食谱应用程序,我遵循了关于如何 $inc 我的键/值的 Youtube 教程,但是我不确定这是我需要提供给我的 HTML 的信息。根据其他例子,我在HTML中对应的视图信息是这样的:
<a href="{{url_for('view_recipe', recipe_id=recipe._id)}}" class="waves-effect waves-light btn btn_small blue">{{recipe.views})</a>
我已经为路线提供了一个 url_,并制作了我认为是相关的 recipe_id=recipe._id,就像我在其他示例中看到的那样,我用它来定位 id。
我的代码:
这是我的 "view_recipe" 和 "view_count" 路线:
@app.route('/view_recipe/<recipe_id>')
def view_recipe(recipe_id):
the_recipe = mongo.db.recipes.find_one({"_id": ObjectId(recipe_id)})
return render_template('view_recipe.html', recipe=the_recipe)
@app.route('/view_count/<recipe_id>')
def view_count(recipe_id):
mongo.db.recipes
recipes.update({'_id': str(recipe_id)}, {'$inc': {'views': int(1)}})
return url_for('view_recipe.html')
这是我在 "view_recipe.html" 中提供的查看次数部分,我在其中放置 {{recipe.view}}
<a href="{{url_for('view_recipe', recipe_id=recipe._id)}}" class="waves-effect waves-light btn btn_small blue">{{recipe.views})</a>
当我运行此代码时会发生什么与我预期会发生什么:
代码运行,但它并没有像我预期的那样增加。当我刷新页面时,计数器只是保持在 0 并且不会上升。我希望一旦页面被刷新,计数器的值将会增加并显示在浏览器中,并在我的 MongoDb 集合中更新。
以防万一……
如果您需要更多信息,或者我不够清楚或解释得不够清楚,请告诉我,我会改正的。
谢谢。
【问题讨论】:
-
您拥有
view_count视图,但您无法访问它。您可能应该直接在view_recipe视图中增加计数器。 -
感谢您的回复。也许我的措辞错误,但这就是我尝试过的:@app.route('/view_recipe/
') def view_recipe(recipe_id): the_recipe = mongo.db.recipes.find_one({"_id": ObjectId (recipe_id)}, {'$inc': {'views': int(1)}}) return render_template('view_recipe.html', recipe=the_recipe) 我得到了这个错误: Unsupported projection option: $inc: {观看次数:1 } -
另外,很抱歉,我不确定如何在 cmets 中格式化代码。对不起,这很乱。
-
我不熟悉 MongoDB,但您可能无法增加计数器并在一次查询中找到配方。尝试使用两条指令:
the_recipe = mongo.db.recipes.find_one({"_id": ObjectId(recipe_id)})然后mongo.db.recipes.update({'_id': str(recipe_id)}, {'$inc': {'views': int(1)}})。 -
你也应该保持一致,在这两种情况下都使用
ObjectId(recipe_id)或str(recipe_id)。