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
相关产品推荐
相关产品推荐

