Django注册:如何允许用户删除其帐户? [英] Django-registration: How to allow user delete their account?

查看:113
本文介绍了Django注册:如何允许用户删除其帐户?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个简单的网站,用户可以在其中注册以便访问私人内容并接收新闻通讯。我已经使用 django-registration 进行用户注册和身份验证,并使用了一些HTML模板此处



整个系统正在运行(登录,注销,密码恢复等),但我意识到用户无法从网站上删除其帐户。是否为此设计了一个插件,或者如何扩展注册类来做到这一点?删除后,我宁愿使用真正的抑制方式,而不仅仅是让用户处于非活动状态。

解决方案

您可以执行以下操作:

  def delete_user(请求,用户名):
context = {}

try:
u = User.objects.get(username = username)
u.delete ()
context ['msg'] ='用户已删除。'
,除了User.DoesNotExist:
context ['msg'] ='用户不存在。'
例外,例如e:
context ['msg'] = e.message

return render(request,'template.html',context = context)

,并具有以下网址格式:

  url(r'^ delete /(?P< username> [\w | \W .-] +)/ $',views.delete_user,name ='delete-user')

这将完成工作。


但是,如文档说:


is_active


布尔值。指定是否应将此用户帐户视为活动帐户。 我们建议您将此标志设置为 False 而不是删除帐户;这样,如果您的应用程序具有用户的任何外键,则外键不会中断。


将用户设置为不活动而不是将其完全从数据库中删除,因为外键会中断。


因此,您可以简单地执行以下操作:

  def delete_user(请求,用户名):
context = {}

try:
user = User.object.get(username = username)
user.is_active = False
user.save()
context ['msg'] ='配置文件已成功禁用。'
,除了User.DoesNotExist:
#...
,但例外为e:
#...

#...

由于现在每个人都可以访问此视图,因此必须添加一些权限。一种简单的方法是重写内置的 @user_passes_test 装饰器:

  @user_passes_test (lambda u:u.is_staff,login_url = reverse_lazy('login'))
def delete_user(请求,用户名):
#...


I have a simple website where users can register in order to have access to private content and to receive a newsletter. I have used django-registration for user registration and authentication, and used some HTML templates from here.

The whole system is working (login, logout, password recovery, etc.) but I realized that user cannot delete their account from the website. Is there a plugin designed for this, or how to extend the registration classes to do that? By deleting, I'd prefer a real suppression, not just making the user inactive.

解决方案

You can do something like this:

def delete_user(request, username):
    context = {}
    
    try:
        u = User.objects.get(username=username)
        u.delete()
        context['msg'] = 'The user is deleted.'       
    except User.DoesNotExist: 
        context['msg'] = 'User does not exist.'
    except Exception as e: 
        context['msg'] = e.message

    return render(request, 'template.html', context=context) 

And have a url pattern like:

url(r'^delete/(?P<username>[\w|\W.-]+)/$', views.delete_user, name='delete-user')

This will do the work. It will delete a user by given username.

But, as the docs say:

is_active

Boolean. Designates whether this user account should be considered active. We recommend that you set this flag to False instead of deleting accounts; that way, if your applications have any foreign keys to users, the foreign keys won’t break.

It is a better approach to set the user as inactive instead of deleting it totally from the database, because the foreign keys will break.

So you can simply do:

def delete_user(request, username):
    context = {}

    try:
        user = User.object.get(username=username)
        user.is_active = False
        user.save()
        context['msg'] = 'Profile successfully disabled.'
    except User.DoesNotExist:
        # ...
    except Exception as e:
        # ...
    
    # ...

And as now everyone can access this view, you must add some permissions. A straightforward approach will be to override the built-in @user_passes_test decorator:

@user_passes_test(lambda u: u.is_staff, login_url=reverse_lazy('login'))
def delete_user(request, username):
    # ...

这篇关于Django注册:如何允许用户删除其帐户?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆