【问题标题】:Django-- Deactivate User account instead of deleting itDjango - 停用用户帐户而不是删除它
【发布时间】:2017-12-07 19:07:30
【问题描述】:

我想停用用户帐户而不是删除它。我想做一些类似 user.is_active = False 的事情。我有一个删除用户配置文件的视图,它可以工作,但现在我需要将其更改为仅停用。 这是我的看法:

def delete_profile(request):
    user = User.objects.filter(id = request.user.profile.user_id)
    try:
        user.delete()
    except:
        messages.error(request,'Please try again.')
        return redirect('profile')

    messages.success(request, 'Profile successfully deleted.')
    return redirect('index')

我尝试了 User.is_active = False ,它显示成功消息但没有执行任何操作。当我在管理面板中检查用户时,它仍然会将用户标记为活动。

知道如何实现这一目标吗?提前致谢

【问题讨论】:

    标签: django authentication django-models


    【解决方案1】:

    您应该显示无效的代码。不过,从您的描述来看,您做错了一些事情。

    首先,.filter() 总是返回一个查询集,而不是一个实例。要获取实例,您应该使用.get()

    其次,User 是类;实例是user

    第三,您根本没有没有理由在这里进行查询。 request.user 已经是用户实例。无需获取该用户,获取其个人资料,向个人资料询问用户 ID,然后执行另一个查询以取回您开始使用的用户。只需使用您已有的用户即可。

    最后,永远不要填写空白except,因为这会捕获各种意外错误并隐藏任何可能出错的地方。只捕获您真正知道如何处理的异常。在这种情况下,您无需处理任何特定的事情;如果出现任何意外错误,让 Django 正常报告该错误。

    def delete_profile(request):
        user = request.user
        user.is_active = False
        user.save()
        messages.success(request, 'Profile successfully disabled.')
        return redirect('index')
    

    【讨论】:

      【解决方案2】:

      您可能需要设置user.is_active = False,然后保存user 对象。

      def delete_profile(request):        
          user = request.user
          user.is_active = False
          user.save()
          logout(request)
          messages.success(request, 'Profile successfully disabled.')
          return redirect('index')
      

      【讨论】:

      • @Daniel Roseman,实际上,这种观点存在更多的逻辑错误。对不起,太无知了。如果我可能会问,看到你对这个上下文有更多的经验和知识,在这个所谓的删除之后用户是否需要注销??
      • 如果我使用查询,代码不起作用。我只是做了 user = request.user 并且它起作用了
      • 是的,这比我的代码要好得多。学到了一些新东西。谢谢大佬。
      • @FazilZaid 关于注销的好点。我很确定中间件会在下一页加载时将用户标记为匿名,但值得明确说明。
      【解决方案3】:

      你也需要保存:

      user.is_active = False
      user.save()
      

      【讨论】:

        【解决方案4】:

        调用user.is_active = False后,需要调用user.save()将更改写入数据库

        【讨论】:

          猜你喜欢
          • 2021-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-10
          • 1970-01-01
          • 1970-01-01
          • 2016-10-29
          • 1970-01-01
          相关资源
          最近更新 更多