我想允许用户删除他的帐户,删除后,我希望用户退出并查看html页面account_deleted.html
进行确认。
学生/ 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设置为我的主页。
学生/ urls.py:
path('logout/', LogoutView.as_view(), name='logout'),
如果删除帐户,如何让delete_account(request)
函数同时返回渲染和重定向?这甚至可能吗?谢谢!
您可以在删除帐户之前将用户注销,方法是在logout(request)
行之前放置user.delete()
。您需要使用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
中的当前用户 - 如果你的auth后端允许重复的用户名,则可能会有危险。
还有这个:
return render(request, "students/account_deleted.html", context) and redirect("students:logout")
当然是完全错的。一个视图返回一个HTTP响应,你不能返回两个(它没有任何意义),你不能“和”两个响应在一起(好吧,你可以但结果肯定不是你所期望的 - 阅读关于and
算子的FineManual)。
正确的解决方案是1 /手动注销用户(cf voodoo-burger的答案),2 / use the messages framework通知用户她的accont已被删除,3 /重定向到主页(你总是希望在成功后重定向发布,cf https://en.wikipedia.org/wiki/Post/Redirect/Get为什么)。