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

