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

