You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:01:17