2012-02-20 23 views
5

que creó UserProfile (se extiende desde el usuario) y se escribe en settings.pyBorrar usuario al eliminar PerfilUsuario

AUTH_PROFILE_MODULE = 'mainapp.UserProfile'. 

Al eliminar UserProfile (del área de administración) Me gustaría eliminar también User artículo.

Intento eliminar el usuario así que self.user.delete(), pero el método eliminar (en UserProfile) no llame. Por qué ?

Este es mi código:

class UserProfile(models.Model): 
    avatar = models.ImageField(upload_to = settings.PATH_AVATARS, blank=True) 
    url = models.URLField(blank=True) 
    user = models.OneToOneField(User) 

    def __unicode__(self): 
     return self.user.username 

    def delete(self, *args, **kwargs): 
     self.user.delete() 
     super(UserProfile, self).delete(*args, **kwargs) 

Respuesta

11

En primer lugar, para responder por qué "delete()" no se llama desde el administrador. Esta declaración es:

  1. cierto en el caso de supresión de objetos de la vista de lista, es decir./Admin/auth/user/comprobar algunas cajas a continuación, haga clic en Acciones -> eliminar), esto es debido a que el método delete() de un conjunto de consultasse llama,
  2. incorrecto en el caso de la eliminación de un objeto a partir de la change_form , es decir./Admin/auth/user/1/haga clic en Borrar, aquí es donde el método delete() del objeto se llama

Dicho esto, _delete signals están bien soportados. He aquí cómo usted puede utilizarlo:

from django.db.models import signals 

def delete_user(sender, instance=None, **kwargs): 
    try: 
     instance.user 
    except User.DoesNotExist: 
     pass 
    else: 
     instance.user.delete() 
signals.post_delete.connect(delete_user, sender=UserProfile) 

Así es como he comprobado:

In [1]: from django.contrib.auth.models import User; from testapp.models import UserProfile; User.objects.all().delete(); UserProfile.objects.all().delete() 

In [2]: user=User(username='foo'); user.save() 

In [3]: profile=UserProfile(user=user); profile.save() 

In [4]: UserProfile.objects.all().delete() 

In [5]: User.objects.all() 
Out[5]: [] 

Por supuesto, esto también funciona cuando el método delete() del objeto se llama:

In [1]: from django.contrib.auth.models import User; from testapp.models import UserProfile; User.objects.all().delete(); UserProfile.objects.all().delete() 

In [2]: user=User(username='foo'); user.save() 

In [3]: profile=UserProfile(user=user); profile.save() 

In [4]: profile.delete() 

In [5]: User.objects.all() 
Out[5]: [] 

Tenga en cuenta que debido a cascade delete, esto funciona en ambos sentidos:

In [1]: from django.contrib.auth.models import User; from testapp.models import UserProfile; User.objects.all().delete(); UserProfile.objects.all().delete() 

In [2]: user=User(username='foo'); user.save() 

In [3]: profile=UserProfile(user=user); profile.save() 

In [4]: user.delete() 

In [5]: User.objects.all() 
Out[5]: [] 

In [6]: UserProfile.objects.all() 
Out[6]: [] 

Si necesita más información sobre las señales, consulte Django's extensive documentation.

+0

Gracias, eso funciona. Pero ahora tengo otro problema. Cuando he escrito signals.post_delete.connect (DELETE_USER, remitente = PerfilUsuario) i debe escribir también de mainapp.models importar PerfilUsuario y cuando me registro - dice error IntegrityError en/cuentas/registrarse/ clave duplicada value viola la restricción única "mainapp_userprofile_user_id_key_" – yAnTar

+0

¿Puede abrir otro tema e incluir más detalles (código), por favor? No entiendo tu comentario muy bien ... Gracias de antemano – jpic

+0

Lo siento, todo está bien, muevo las señales del archivo view.py al archivo signals.py y funciona bien. – yAnTar

Cuestiones relacionadas