Django 用户帐户删除然后 return 重定向并呈现

Django user account delete and then return redirect and render

我想允许用户删除他的帐户,删除后,我希望用户注销并查看 html 页面 account_deleted.html 进行确认。

students/views.py:

def delete_account(request):
    user = User.objects.get(username=request.user)
    user.delete()

    context = {
        "deleted_msg": "Account has been deleted",
    }
    return render(request, "students/account_deleted.html", context) and redirect("students:logout")

对于注销,我使用的是内置的 LogoutView 函数。我的 settings.py 中的注销重定向 URL 设置为我的主页。

students/urls.py:

path('logout/', LogoutView.as_view(), name='logout'),

如果帐户被删除,我怎样才能使 delete_account(request) 函数 return 同时呈现和重定向?这可能吗? 谢谢!

您可以在删除帐户之前注销用户,方法是在 user.delete() 行之前放置 logout(request)。您需要使用 from django.contrib.auth import logout.

导入它

正如 Bruno 在他的回答中所说,在 POST 请求之后使用重定向而不是 render 更可取,并且您应该更新您的视图以仅响应 POST 请求。

如果您在删除用户后遇到网站崩溃的问题,请确保您在所有视图中使用了正确的访问控制,例如,通过使用 @login_required 装饰器或等效的 mixin要求用户登录的视图。如果您这样做,用户将在他或她未登录时被重定向到登录页面,而不是使您的网站崩溃。

首先要注意的是:您的视图应该 1/ 只接受登录用户和 2/ 只接受 POST 请求(您绝对不希望 GET 请求从您的数据库中删除任何内容)。还有,这个:

User.objects.filter(username=request.user)

没用 - 您 已经 request.user 中拥有当前用户 - 如果您的身份验证后端允许重复的用户名,则可能存在危险。

还有这个:

return render(request, "students/account_deleted.html", context) and redirect("students:logout")

当然是完全错误的。一个视图 return 是一个 HTTP 响应,你不能 return 两个(这没有任何意义),你也不能 "and" 两个响应在一起(好吧,你可以,但结果肯定不是您所期望的 - 请阅读有关 and 运算符的 FineManual)。

正确的解决方案是 1/ 手动注销用户(cf voodoo-burger 的回答),2/ use the messages framework to inform the user her accont has been deleted, and 3/ redirect to the home page (you ALWAYS want to redirect after a successful post, cf https://en.wikipedia.org/wiki/Post/Redirect/Get 为什么)。