Django访问/watchlist/报NoReverseMatch:viewList路由参数为空匹配失败
错误原因
- 观察列表模板变量引用错误:在
watchlist.html的for循环中,你遍历的集合变量是watchers_items,单条记录命名为post,但View按钮的url反向解析时使用了listing.id,模板上下文没有传入listing变量,导致listing.id为空,反向解析viewList路由时缺少必填的id参数,直接触发NoReverseMatch报错。 - urls.py存在语法错误:
path('watchlist/', views.watchlist_list, name='watchlist_list')行末尾缺少逗号,会导致后续路由解析异常。 - 视图函数存在拼写错误:
watchlist_post、watchlist_list两个函数中均将参数request错误拼写为requset,运行时会触发未定义变量报错。
解决方案
- 修正观察列表页面的变量引用
将watchlist.html中View按钮的代码替换为:
<a href="{% url 'viewList' post.id %}" class="btn btn-dark btn-sm m-1 btn-block">View</a>
和循环的单条记录变量名保持一致即可。
- 修正urls.py语法错误
补充路由末尾的逗号,修正后的urlpatterns代码如下:
urlpatterns =[ # Watchlist path('Post/<int:id>/watchlist_post/change/<str:reverse_method>', views.watchlist_post, name='watchlist_post'), path('watchlist/', views.watchlist_list, name='watchlist_list'), path('Post/<int:id>', views.viewList, name='viewList'), ]
- 修正视图函数的拼写错误
将watchlist_post、watchlist_list两个函数中所有的requset替换为正确的request即可,修正后的示例代码:
@login_required def watchlist_post(request, id, reverse_method): listing = get_object_or_404(Post, id=id) if listing.watchers.filter(id=request.user.id).exists(): listing.watchers.remove(request.user) else: listing.watchers.add(request.user) if reverse_method == "viewList": return viewList(request, id) return HttpResponseRedirect(reverse(reverse_method)) @login_required def watchlist_list(request): user = request.user watchers_items = user.favorite.all() context = { 'watchers_items': watchers_items } return render(request, 'auctions/watchlist.html', context)
内容的提问来源于stack exchange,提问作者wajd
相关产品推荐
相关产品推荐

