首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django注册:如何允许用户删除他们的帐户?

Django注册:如何允许用户删除他们的帐户?
EN

Stack Overflow用户
提问于 2017-08-20 17:17:01
回答 2查看 4.9K关注 0票数 2

我有一个简单的网站,用户可以注册,以便有权访问私人内容和接收时事通讯。我用过django-registration用于用户注册和身份验证,并使用了来自here

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-20 17:55:40

你可以这样做:

代码语言:javascript
复制
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模式:

代码语言:javascript
复制
url(r'^delete/(?P[\w|\W.-]+)/$', views.delete_user, name='delete-user')

这将完成工作。它将按给定的用户名删除用户。但是,asthe docs说:

is_active

布尔值。指定是否应将此用户帐户视为活动帐户。

我们建议您将此标志设置为

而不是删除帐户;这样,如果您的应用程序对用户有任何外键,外键就不会中断。

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

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

代码语言:javascript
复制
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

装饰者:

代码语言:javascript
复制
@user_passes_test(lambda u: u.is_staff, login_url=reverse_lazy('login'))
def delete_user(request, username):
    # ...
票数 8
EN

Stack Overflow用户

发布于 2021-02-25 09:02:37

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

views.py

代码语言:javascript
复制
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

代码语言:javascript
复制
from django.urls import path
from .views import UserDelete

urlpatterns = [
    path('/delete', UserDelete.as_view(), name='user_confirm_delete'),
]

模板/用户_确认_delete.html

代码语言:javascript
复制
{% extends '_base.html' %}
{% load account %}

{% block title %}User Account Delete{% endblock title %}

{% block content %}
    {% if user.is_authenticated %}
    
        {% csrf_token %}
        Are you sure you want to delete your account?
        
    
    {% else %}
        Login
    {% endif %}
{% endblock content %}

模板/_base.html

代码语言:javascript
复制
{% if user.is_authenticated %}
    Delete Account
{% else %}
    Log In
{% endif %}

Django 3.1文档:Generic editing views

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45780470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档