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

Django中不使用LoginRequiredMixin实现未登录用户提交评论跳转登录页

解决方案:让未登录用户提交评论时跳转至登录页

我明白你的需求——既要允许所有人自由查看帖子详情,又要在未登录用户尝试提交评论时引导他们去登录页面。其实实现起来很简单,只需要在post方法的未登录分支里添加重定向逻辑就行,还能优化体验,让用户登录后直接回到当前帖子。

后端代码修改

首先,你可以用Django自带的工具函数来处理登录跳转,替换掉代码里的???部分:

from django.contrib.auth.views import redirect_to_login

class PostDetail(DetailView):
    model = Post
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['form'] = CommentForm()
        return context
    def post(self, request, *args, **kwargs):
        form = CommentForm(request.POST)
        if request.user.is_authenticated:
            if form.is_valid():
                comment = form.save(commit=False)
                comment.comment_owner = request.user
                comment.post = Post.objects.get(pk=kwargs['pk'])
                comment.save()
                return redirect('blog:detail', pk=kwargs['pk'])
            else:
                return redirect('blog:detail', pk=kwargs['pk'])
        else:
            # 获取当前页面的完整路径,作为登录后跳转的目标
            next_url = self.request.get_full_path()
            # 自动处理登录跳转,并携带next参数让用户登录后回到当前页
            return redirect_to_login(next_url)

如果你想手动拼接跳转URL,也可以这么写(需要先导入相关模块):

from django.conf import settings
from django.shortcuts import redirect

# 替换else分支的代码
else:
    next_url = self.request.get_full_path()
    return redirect(f"{settings.LOGIN_URL}?next={next_url}")

额外的前端优化(可选)

为了让用户体验更顺畅,你还可以在模板里做判断:当用户未登录时,不显示评论表单,直接展示“登录后评论”的链接,同样带上next参数:

{% if user.is_authenticated %}
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">提交评论</button>
    </form>
{% else %}
    <a href="{% url 'login' %}?next={{ request.path }}">登录后发表评论</a>
{% endif %}

这样前后端配合,既通过后端校验保证了功能安全(防止绕过前端直接提交),又提升了用户的操作体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:03:46