Django认证用户删除账户异常:提交后页面刷新无删除效果
Django已认证用户删除自身账户功能异常
点击删除按钮后,页面仅刷新停留在原模板,POST请求返回200 OK状态码,日志记录如下:
[06/Aug/2022 11:46:33] "POST /members/profile/ HTTP/1.1" 200 4998
相关代码文件
members.views.profiles.py
from django.shortcuts import render from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User @login_required(login_url="/accounts/login/") def profile(request): template_name = "members/profile.html" context = {} return render(request, template_name, context) def profile_delete(request, pk): user_profile = User.objects.filter(pk=pk) template_name = "members/profile_delete.html" context = { "user_profile": user_profile, }, if request.method == "POST": user_profile.delete() return render(request, template_name, context) return render(request, template_name, context)
members.urls.py
from django.urls import path from allauth.account import views as allauth_views from . import views app_name = "members" urlpatterns = [ path("login/", allauth_views.LoginView.as_view(), name="login"), path("logout/", allauth_views.LogoutView.as_view(), name="logout"), path("profile/", views.profile, name="profile"), path("profile/<int:pk>/delete/", views.profile_delete, name="profile_delete"), ]
profile.html
<div> <form method="POST"> {% csrf_token %} <p>确定要删除账户 <strong>{{ user | title }}</strong> 吗?</p> <button class="btn btn-danger" href="{% url 'members:profile_delete' user.pk %}" type="submit"> 删除账户 </button> </form> </div>
解决方案及问题说明
核心问题点
- 表单未指定
action属性,导致POST请求发送到当前的/members/profile/路径,而非删除接口/members/profile/<pk>/delete/ - 原视图使用
User.objects.filter(pk=pk)返回QuerySet,即使删除后仍会返回空QuerySet,无法准确处理单个用户的删除逻辑 - 原视图中
context定义后多了一个逗号,导致context变成元组而非字典,可能引发模板渲染异常
修改后的代码
调整后的profile.html(补充表单action)
<div> <form method="POST" action="{% url 'members:profile_delete' user.pk %}"> {% csrf_token %} <p>确定要删除账户 <strong>{{ user | title }}</strong> 吗?</p> <button class="btn btn-danger" type="submit"> 删除账户 </button> </form> </div>
修改后的views.py
from django.shortcuts import render, get_object_or_404 from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User @login_required(login_url="/accounts/login/") def profile(request): template_name = "members/profile.html" context = {} return render(request, template_name, context) def profile_delete(request, pk): user_profile = get_object_or_404(User, pk=pk) if request.method == "POST": user_profile.delete() # 删除后可跳转到首页或登录页,此处保留原模板渲染逻辑 template_name = "members/profile_delete.html" return render(request, template_name, {}) # GET请求展示确认页面 return render(request, "members/profile_delete.html", {"user_profile": user_profile})
内容的提问来源于stack exchange,提问作者Brunomcr
相关产品推荐
相关产品推荐

