删除用户删除用户配置
问题描述:
当我创建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)
答
首先,要回答为什么“删除()” 不是从管理调用。这种说法是:
- 真正从列表视图,即删除对象的情况。 /管理/ AUTH /用户/检查一些箱子然后单击操作 - >删除),这是因为一个查询集的delete()方法被调用时,
- 从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。
谢谢,这是有效的。 但现在我有另一个麻烦。 当我写signals.post_delete.connect(DELETE_USER,发件人=用户配置)我也必须写 从mainapp.models导入用户配置 ,当我注册 - 在说错误 IntegrityError /帐号/注册/ 重复键值违反了唯一约束条件“mainapp_userprofile_user_id_key” – yAnTar 2012-02-20 16:32:53
您可以打开另一个主题并包含更多详细信息(代码)吗?我不明白你的评论很好......在此先感谢 – jpic 2012-02-20 16:34:55
对不起,一切正常,我将文件view.py中的信号移动到文件signals.py并运行良好。 – yAnTar 2012-02-21 10:13:05