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

Django项目点赞按钮点击后跳转首页,如何实现点赞后停留当前页?

Django点赞后跳转首页修复方案

出现这个问题的核心原因通常有两个:一是视图执行过程中抛出了未捕获的异常,触发了项目全局错误跳转逻辑;二是url_from参数传值为空,重定向时默认跳转到网站根路径(首页)。

修复步骤

1. 完善视图逻辑,增加异常捕获和重定向 fallback

修改后的views.py代码如下:

from django.shortcuts import redirect, get_object_or_404
from django.http import HttpResponseBadRequest

class AddLikeView(View):
     def post(self, request, *args, **kwargs):
         # 先校验用户登录状态,避免未登录用户提交请求
         if not request.user.is_authenticated:
             return redirect('login') # 换成你项目的登录路由名
         
         # 用get_object_or_404避免查询不到数据时报错
         blog_post_id = request.POST.get('blog_post_id')
         if not blog_post_id:
             return HttpResponseBadRequest("缺少博客ID")
         blog_post_inst = get_object_or_404(News, id=int(blog_post_id))

         # 优先用表单传的url_from,没有的话用请求来源地址做兜底
         url_from = request.POST.get('url_from') or request.META.get('HTTP_REFERER', '/')

         try:
             BlogLikes.objects.get(blog_post=blog_post_inst, liked_by=request.user)
             # 如果已经点过赞,可以在这里加取消逻辑或者直接跳过
         except BlogLikes.DoesNotExist:
              # 只捕获指定异常,不要捕获所有Exception避免掩盖错误
              blog_like = BlogLikes(
                  blog_post=blog_post_inst,
                  liked_by=request.user,
                  like=True
              )
              blog_like.save()
         return redirect(url_from)

注:直接从request里取登录用户,不需要前端传user_id,避免被篡改参数

2. 优化模板逻辑

移除前端传user_id的逻辑,同时禁止未登录用户看到点赞提交按钮,避免无效请求:

{% if user.is_authenticated %}
<form action="{% if not is_liked_bool %}{% url 'add' %}{% else %}{% url 'remove' %}{% endif %}" method="post">
{% csrf_token %}
<input type="hidden" name="blog_post_id" value="{{ blog_post_id }}">
<input type="hidden" name="url_from" value="{{ request.path }}">

{% if is_liked_bool %}
    <input type="hidden" name="blog_likes_id" value="{{ blog_likes_id }}">
{% endif %}

<button type="submit" class="btn btn-success">
    {% if not is_liked_bool %}
        <i class="fi-xnluxl-heart">♥</i>
    {% else %}
        <i class="fi-xnluxl-heart-solid">♥</i>
    {% endif %}
    <span class="likes-qty">{{ likes_counter }}</span>
</button>
</form>
{% else %}
<!-- 未登录用户可以展示跳登录的提示,或者禁用状态的按钮 -->
<a href="{% url 'login' %}" class="btn btn-success">登录后可点赞</a>
{% endif %}

可选优化(无刷新点赞)

如果想要更好的用户体验,可以用AJAX提交点赞请求,不需要刷新页面即可更新点赞状态和计数。

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:27:05