删除用户删除用户配置

问题描述:

当我创建UserProfile(从用户扩展),并写入到settings.py删除用户删除用户配置

AUTH_PROFILE_MODULE = 'mainapp.UserProfile'. 

当我删除UserProfile(从管理区),我也想删除User项目。

我尝试删除用户,所以self.user.delete(),但方法删除(在UserProfile中)不要调用。为什么?

这是我的代码:

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) 

首先,要回答为什么“删除()” 不是从管理调用。这种说法是:

  1. 真正从列表视图,即删除对象的情况。 /管理/ AUTH /用户/检查一些箱子然后单击操作 - >删除),这是因为一个查询集的delete()方法被调用时,
  2. 从change_form删除对象的情况下,错误的即, /管理/ AUTH /用户/ 1 /点击删除,这是其中对象的删除()方法被调用

这就是说,_delete signals是公支撑。这里是你如何使用它:

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) 

这是我测试过它:

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]: [] 

当然,这也适用当对象的delete()方法叫做:

因为
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]: [] 

注意cascade delete,这是双向的:

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]: [] 

如果您需要了解更多关于信号的信息,请参阅Django's extensive documentation

+0

谢谢,这是有效的。 但现在我有另一个麻烦。 当我写signals.post_delete.connect(DELETE_USER,发件人=用户配置)我也必须写 从mainapp.models导入用户配置 ,当我注册 - 在说错误 IntegrityError /帐号/注册/ 重复键值违反了唯一约束条件“mainapp_userprofile_user_id_key” – yAnTar 2012-02-20 16:32:53

+0

您可以打开另一个主题并包含更多详细信息(代码)吗?我不明白你的评论很好......在此先感谢 – jpic 2012-02-20 16:34:55

+0

对不起,一切正常,我将文件view.py中的信号移动到文件signals.py并运行良好。 – yAnTar 2012-02-21 10:13:05