Django-registration:如何允许用户删除他们的帐户?

时间:2017-08-20 09:17:01

标签: python django django-registration

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

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

2 个答案:

答案 0 :(得分:3)

您可以这样做:

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

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

但是,正如the docs所说:

  

is_active

     

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

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

所以你可以这样做:

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

答案 1 :(得分:0)

我使用 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

相关问题