我希望允许用户删除他的帐户,并且在删除后,我希望该用户注销并查看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)
函数返回渲染并同时重定向?那有可能吗?
谢谢!
答案 0 :(得分:1)
您可以在logout(request)
行之前放置user.delete()
,以注销用户,然后再删除帐户。您将需要使用from django.contrib.auth import logout
导入它。
如Bruno在回答中所说,在POST请求之后,最好使用重定向而不是render
,并且您应该更新视图以仅响应POST请求。
如果删除用户后您的网站崩溃有麻烦,请确保在所有视图中使用正确的访问控制,例如,在所有视图上使用@login_required
装饰器或等效的mixin要求用户登录。如果您执行此操作,则仅当该用户未登录时,该用户才会被重定向到登录页面,而不会使您的网站崩溃。
答案 1 :(得分:0)
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以了解原因)。