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

问题描述 投票:0回答:2

我想允许用户删除他的帐户,删除后,我希望用户退出并查看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)函数同时返回渲染和重定向?这甚至可能吗?谢谢!

django django-users
2个回答
1
投票

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

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

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


0
投票

第一件事第一:你的观点应该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为什么)。

© www.soinside.com 2019 - 2024. All rights reserved.