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

Django中如何实现未登录用户点击收藏按钮后两次跳转回书籍页?

问题根因

未登录用户点击收藏按钮后,Django的@login_required装饰器会将当前收藏接口地址作为next参数传给登录页,登录成功后会跳转回收藏接口执行收藏逻辑。此时收藏接口取的HTTP_REFERER是登录页的地址,所以执行完收藏后就停留在了登录页。

解决方案

1. 修改模板中的收藏按钮代码

给收藏接口的请求添加next参数,值为当前书籍详情页的地址,确保后续能拿到要跳转的目标页面:

<a class="addInBookmarks" href="{% url 'addBookmark' book.slug %}?next={{ request.path }}">In bookmarks</a>

2. 调整视图层的重定向逻辑

修改views.py中的addBookmark视图,优先使用请求参数里的next作为跳转地址,同时增加地址安全性校验,避免开放重定向漏洞:

from django.utils.http import is_safe_url
from django.shortcuts import get_object_or_404 # 优化对象查询,避免slug不存在时报500错误

@login_required
def addBookmark(request, slug):
    book = get_object_or_404(Book, slug=slug)
    # 原有收藏/取消收藏逻辑不变
    if BookMark.objects.filter(user=request.user, book=book).exists():
        BookMark.objects.get(user=request.user, book=book).delete()
    else:
        BookMark.objects.create(user=request.user, book=book)
    
    # 重定向逻辑修改
    redirect_to = request.GET.get('next', request.META.get("HTTP_REFERER", "/"))
    # 校验跳转地址是否为本站地址,防止恶意跳转
    if not is_safe_url(url=redirect_to, allowed_hosts={request.get_host()}):
        redirect_to = "/"
    return HttpResponseRedirect(redirect_to)

注:如果使用Django 3.0及以上版本,将is_safe_url替换为url_has_allowed_host_and_scheme即可,参数用法一致

最终实现流程

修改后完整执行逻辑符合预期:

  • 未登录用户点击收藏按钮 → 跳转登录页,登录页的next参数为带书籍页地址的收藏接口地址
  • 用户登录成功 → 自动跳转至收藏接口执行收藏逻辑
  • 收藏完成 → 读取next参数跳转回原书籍详情页

内容的提问来源于stack exchange,提问作者Стопчак Олег

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:27:04