Django博客添加Like/Unlike功能遇NoReverseMatch问题求助
问题分析与修复方案
核心问题:视图返回上下文缺失关键对象
点击Like/Unlike按钮触发NoReverseMatch的直接原因是:like和unlike视图返回的上下文未传递blog对象,模板中{% url 'unlike' blog.id %}或{% url 'like' blog.id %}里的blog变量为空,导致Django无法生成合法URL。同时初始进入博客详情页时,未传递用户当前的点赞/点踩状态,模板判断逻辑存在漏洞。
分步修复
1. 修复like和unlike视图
确保返回上下文包含blog对象,同时补充点赞/点踩的互斥逻辑:
def like(request, pk): blog = Blog.objects.get(id=pk) user = request.user # 互斥逻辑:删除当前用户对该博客的点踩记录 Unlike.objects.filter(blog=blog, user=user).delete() # 创建或获取点赞记录 _, liked = Like.objects.get_or_create(blog=blog, user=user) # 传递必要上下文 context = { "blog": blog, "liked": True, "has_unliked": False } return render(request, "blog_app/blog_page.html", context) def unlike(request, pk): blog = Blog.objects.get(id=pk) user = request.user # 互斥逻辑:删除当前用户对该博客的点赞记录 Like.objects.filter(blog=blog, user=user).delete() # 创建或获取点踩记录 _, unliked = Unlike.objects.get_or_create(blog=blog, user=user) # 传递必要上下文 context = { "blog": blog, "liked": False, "has_unliked": True } return render(request, "blog_app/blog_page.html", context)
2. 修复blog_view视图
初始进入博客详情页时,提前获取用户的点赞/点踩状态:
def blog_view(request, pk): blog = Blog.objects.get(id=pk) # 检查当前用户是否已点赞/点踩 has_liked = Like.objects.filter(blog=blog, user=request.user).exists() has_unliked = Unlike.objects.filter(blog=blog, user=request.user).exists() context = { "blog": blog, "liked": has_liked, "has_unliked": has_unliked } return render(request, 'blog_app/blog_page.html', context)
3. 优化模板逻辑
调整按钮显示逻辑,确保变量存在且交互合理:
{% extends "main.html" %} {% load static %} {% block content %} <div style="text-align:center;"> <h2>{{blog.title}}</h2> <img src="{{blog.blog_image.url}}" alt="{{blog.title}}" width="630px" height="300px"> </div> <div style="text-align:center;"> {{blog.blog_content|linebreaks}} </div> {% if liked %} <h4><a href="{% url 'unlike' blog.id %}">取消点赞</a></h4> {% elif has_unliked %} <h4><a href="{% url 'like' blog.id %}">取消点踩</a></h4> {% else %} <h4> <a href="{% url 'like' blog.id %}">点赞</a> | <a href="{% url 'unlike' blog.id %}">点踩</a> </h4> {% endif %} {% endblock content %}
4. 可选:优化URL参数类型
Blog的id为整数类型,建议将urls.py中的<str:pk>改为<int:pk>,匹配参数类型:
urlpatterns = [ path("", views.home, name='home'), path("blog_page/<int:pk>/", views.blog_view, name='blog_page'), path("like/<int:pk>/", views.like, name="like"), path("unlike/<int:pk>/", views.unlike, name="unlike"), ]
内容的提问来源于stack exchange,提问作者Shishir Rehan
相关产品推荐
相关产品推荐

