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

Django新手求助:创建评论时意外登出跳转异常问题

嘿,看起来你遇到了一个挺奇怪的问题——点击创建评论的按钮后,居然被登出跳转到首页了,而不是正常保存评论并跳转到列表页。咱们一步步来排查可能的原因:

1. 先检查表单的实际提交路径

这是最可能的问题根源:你的表单可能意外把请求发送到了登出的URL,而不是评论创建的URL。

你可以打开浏览器的开发者工具(按F12),查看页面渲染后的表单HTML代码,找到<form>标签的action属性,确认它的值是类似/usercomments/create/的正确路径,而不是/userprofile/logout/。

如果action路径确实错了,那说明模板里的{% url 'usercomments:create' %}标签解析出错了,你需要检查:

  • 项目主URL配置文件中,是否正确包含了usercomments应用的URL,比如应该是这样的:
    # 主urls.py
    from django.conf.urls import url, include
    
    urlpatterns = [
        # 其他URL配置
        url(r'^usercomments/', include('usercomments.urls')),
        url(r'^userprofile/', include('userprofile.urls')),
    ]
    
  • 确认usercomments/urls.py里的app_name = 'usercomments'已经正确设置,命名空间没有出错。

2. 修复评论创建视图的缩进错误

看你提供的comments_create视图代码,缩进逻辑有问题,这可能导致表单验证失败时出现异常,进而引发意外行为:

原代码的缩进问题:

@login_required(login_url="/userprofile/login/")
def comments_create(request):
 if request.method == 'POST':
 form = forms.CreateComment(request.POST)
 if form.is_valid():
 # save article to db
 instance = form.save(commit=False)
 instance.author = request.user
 instance.save()
 return redirect('usercomments:list')
 else:
 form = forms.CreateComment()
 return render(request, 'usercomments/comments_create.html', { 'form': form })

当前逻辑的问题是:如果是POST请求但表单验证失败,代码会直接跳出if request.method == 'POST'块,函数没有返回值,这会导致Django抛出服务器错误。

正确的缩进应该是这样的(保留验证失败的表单,让用户看到错误提示):

@login_required(login_url="/userprofile/login/")
def comments_create(request):
    if request.method == 'POST':
        form = forms.CreateComment(request.POST)
        if form.is_valid():
            # 保存评论到数据库
            instance = form.save(commit=False)
            instance.author = request.user
            instance.save()
            return redirect('usercomments:list')
        # 表单验证失败时,返回带错误信息的表单
        return render(request, 'usercomments/comments_create.html', { 'form': form })
    else:
        form = forms.CreateComment()
        return render(request, 'usercomments/comments_create.html', { 'form': form })

3. 给登出视图加上POST请求限制

你的logout_view目前只处理POST请求,但为了避免意外触发(比如误点链接),建议添加@require_POST装饰器,让它只响应POST请求:

from django.views.decorators.http import require_POST

@require_POST
def logout_view(request):
    logout(request)
    return redirect('/')

4. 确认提交表单时的登录状态

你可以在评论创建模板里加一行代码,验证当前用户是否处于登录状态:

<p>当前登录状态:{{ user.is_authenticated }}</p>

如果显示为False,说明你的会话可能已经过期,login_required装饰器会重定向到登录页,但这和你描述的登出行为不太一样,不过也可以排查一下。

先从第一步检查表单的action路径开始,这是最有可能解决问题的方向。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:17:43