【问题标题】:Django-registration: How to allow user delete their account?Django-registration:如何允许用户删除他们的帐户?
【发布时间】:2018-01-28 13:06:45
【问题描述】:

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

整个系统都在工作(登录、注销、密码恢复等),但我意识到用户无法从网站上删除他们的帐户。是否有为此设计的插件,或者如何扩展注册类来做到这一点?通过删除,我更喜欢真正的压制,而不仅仅是让用户处于非活动状态。

【问题讨论】:

    标签: python django django-registration


    【解决方案1】:

    你可以这样做:

    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) 
    

    并且有一个像这样的 url 模式:

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

    这将完成工作。它将删除给定用户名的用户。

    但是,正如the docs 所说:

    is_active

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

    将用户设置为inactive而不是从数据库中完全删除它是一种更好的方法,因为外键会损坏。

    所以你可以简单地做:

    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:
            # ...
        
        # ...
    

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

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

    【讨论】:

    • 谢谢兄弟。你的回答很有启发性
    【解决方案2】:

    我使用 DeleteView 类来解决类似的问题。 下面的代码允许注册用户无需管理 拥有 Django 管理站点的权限,可以删除自己的帐户 登录后。

    views.py

    from django.contrib.auth import get_user_model
    from django.urls import reverse_lazy
    from django.views.generic.edit import DeleteView
    
    User = get_user_model()
    
    class UserDelete(DeleteView):
        model = User
        success_url = reverse_lazy('home')
        template_name = 'user_confirm_delete.html'
    

    urls.py

    from django.urls import path
    from .views import UserDelete
    
    urlpatterns = [
        path('<int:pk>/delete', UserDelete.as_view(), name='user_confirm_delete'),
    ]
    

    模板/user_confirm_delete.html

    {% extends '_base.html' %}
    {% load account %}
    
    {% block title %}User Account Delete{% endblock title %}
    
    {% block content %}
        {% if user.is_authenticated %}
        <form method="post">
            {% csrf_token %}
            <p>Are you sure you want to delete your account?</p>
            <input type="submit" value="Confirm">
        </form>
        {% else %}
            <p><a href="#">Login</a></p>
        {% endif %}
    {% endblock content %}
    

    模板/_base.html

    {% if user.is_authenticated %}
        <a href="{% url 'user_confirm_delete' user.id %}">Delete Account</a>
    {% else %}
        <a href="#">Log In</a>
    {% endif %}
    

    Django 3.1 文档: Generic editing views

    【讨论】:

    • 这不是说如果我有一个用户的 PK 我可以删除他们的帐户吗?
    猜你喜欢
    • 2016-10-29
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多