让用户在 Django 中删除自己的帐户

Letting Users Delete their own accounts in Django

在 Django 2.2 文档中,它声明如下:

"is_active " is a 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.

我的问题是,如果我有一个网站,并且我按照这种做法让我的用户能够删除自己的帐户, 一旦我的网站获得一些流量,我的数据库不会充满非活动帐户吗?

让您网站上的用户(没有员工或超级用户身份)在 Django 2.2 中正确删除他们自己的帐户的最佳方法是什么?

提前感谢您的帮助

My question is this, If I had a website, and I gave my users the ability to delete their own accounts by following this practice, wouldn't my database be filled with non-active accounts once my website gains a bit of traffic?

最终,。问题是,为什么这是个问题?。数据库通常在主键上构建索引,这意味着它通常可以经常有效地检索给定 post 对象的用户,即使存在一定数量的“死数据”。

删除用户的主要问题是经常有触发器会删除所有相关数据。事实上,假设您有一个 Post 模型:

from django.conf import settings

class Post(models.Model):
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        <b>on_delete=models.CASCADE</b>
    )

这意味着如果您删除一个用户,它将删除该用户作为作者的所有 Post 个对象,当然不仅 Post 秒,而且您 [=44] =] 使用 CASCADE 触发器发送给该用户。这可能不是预期的效果。通常您希望保留用户构建的数据,除非用户(明确地)要求这样做。

您可以定义视图让人们删除他们的帐户,可以是“软”删除(将 .is_active 设置为 False),也可以是“硬”删除(删除对象,并让触发器波动)。您可以创建如下视图:

# soft delete
from django.contrib.auth import logout as auth_logout, get_user_model
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_http_methods

@login_required
@require_http_method(['POST'])
def remove_account(request):
    user_pk = request.user.pk
    auth_logout(request)
    User = get_user_model()
    User.objects.filter(pk=user_pk).<b>update(is_active=False)</b>
    # …
    # return HTTP response

或硬删除:

# hard delete
from django.contrib.auth import logout as auth_logout, get_user_model
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_http_methods

@login_required
@require_http_method(['POST'])
def remove_account(request):
    user_pk = request.user.pk
    auth_logout(request)
    User = get_user_model()
    User.objects.filter(pk=user_pk).<b>delete()</b>
    # …
    # return HTTP response

并在模板中添加一个用于删除帐户的按钮:

<form method="post" action="{% url <i>'name-of-delete-view'</i> %}">
    {% csrf_token %}
    <button type="submit">delete account</button>
</form>

使用 name-of-delete-view 您在 path(…, name=…)re_path(…, name=…).

中为视图指定的名称