2017-08-20 4 views
0

J'ai un site web simple où les utilisateurs peuvent s'inscrire afin d'avoir accès à du contenu privé et de recevoir une newsletter. J'ai utilisé django-registration pour l'enregistrement et l'authentification des utilisateurs, et j'ai utilisé des modèles HTML de here.Django-registration: Comment autoriser l'utilisateur à supprimer son compte?

Tout le système fonctionne (connexion, déconnexion, récupération de mot de passe, etc.) mais j'ai réalisé que l'utilisateur ne peut pas supprimer son compte du site Web. Y at-il un plugin conçu pour cela, ou comment étendre les classes d'inscription pour le faire? En supprimant, je préférerais une réelle suppression, pas seulement rendre l'utilisateur inactif.

Répondre

1

Vous pouvez faire quelque chose comme ceci:

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) 

Et un modèle url comme:

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

Cela fera le travail. Il va supprimer un utilisateur par nom d'utilisateur donné.

Mais, comme the docs disent:

is_active

booléenne. Indique si ce compte d'utilisateur doit être considéré comme actif. Nous vous recommandons de définir cet indicateur sur False au lieu de supprimer des comptes; De cette façon, si vos applications ont des clés étrangères pour les utilisateurs, les clés étrangères ne se casseront pas.

Il est une meilleure approche pour définir l'utilisateur comme inactif au lieu de le supprimer totalement de la base de données, parce que les clés étrangères briseront.

Vous pouvez simplement faire:

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

    # ... 

Et maintenant tout le monde peut accéder à ce point de vue, vous devez ajouter des autorisations. Une approche simple consiste à remplacer le décorateur @user_passes_test intégré:

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