让用户在 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=…)
.
中为视图指定的名称
在 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=…)
.