Django访问/bid/2报NoReverseMatch错误的原因及解决方法咨询
错误原因
- 核心原因是视图返回模板时的上下文变量名不匹配:
set_bid视图给item.html传递的商品对象键名为listings,但模板中所有地方调用商品属性时用的变量名是item,导致模板渲染时item变量为空,调用{% url 'set_bid' item.id %}反转URL时无法传入必填的list_id参数,触发NoReverseMatch错误。 - 次要问题:视图中给模板传递的
bid是filter()返回的查询集(多个对象的集合),不是单个出价实例,模板后续调用{{ bid.bid }}时也会触发取值错误。 - 冗余代码问题:对查询集调用
update()方法后不需要再执行save(),多余的save()调用会报错。
解决方法
- 修正
set_bid视图的上下文变量名,把listings改为item,和模板的变量名保持一致,同时修正bid的取值逻辑:
return render(request,"auctions/item.html",{ # 把键名从listings改成item "item":Listing.objects.get(pk=list_id), "comments":Comments.objects.filter(comment_id=list_id), # 用first()拿单个出价实例,没有对应出价时返回None "bid":Bids.objects.filter(item=item).first(), })
- 删除视图中多余的
b.save()代码,修改后对应逻辑如下:
b=Bids.objects.filter(item=item) if b: b.update(bid=price) # 删掉原来的b.save()行 else: b = Bids(bid=price,user=username,item=item) b.save()
内容的提问来源于stack exchange,提问作者Aaryan Rawat
相关产品推荐
相关产品推荐

