Django用户帐户删除,然后返回重定向和渲染

时间:2019-02-25 10:40:47

标签: django django-users

我希望允许用户删除他的帐户,并且在删除后,我希望该用户注销并查看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)函数返回渲染并同时重定向?那有可能吗? 谢谢!

2 个答案:

答案 0 :(得分:1)

您可以在logout(request)行之前放置user.delete(),以注销用户,然后再删除帐户。您将需要使用from django.contrib.auth import logout导入它。

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

如果删除用户后您的网站崩溃有麻烦,请确保在所有视图中使用正确的访问控制,例如,在所有视图上使用@login_required装饰器或等效的mixin要求用户登录。如果您执行此操作,则仅当该用户未登录时,该用户才会被重定向到登录页面,而不会使您的网站崩溃。

答案 1 :(得分:0)

首先,您的视图应该1 /仅接受登录的用户,2 /仅接受POST请求(您绝对不希望GET请求从数据库中删除任何内容)。此外,这:

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

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

这:

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

当然是错误的。一个视图返回一个HTTP响应,您不能返回两个(这毫无意义),也不能将两个响应“和”在一起(嗯,可以,但是结果肯定不是您期望的-阅读有关and运算符的FineManual。)

正确的解决方案是1 /手动注销用户(参见voodoo-burger的答案),2 / use the messages framework通知用户她的助手已被删除,以及3 /重定向到主页(您成功发布后总是希望重定向,请参阅https://en.wikipedia.org/wiki/Post/Redirect/Get以了解原因)。