2012-02-20 190 views
5

當我創建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) 

回答

11

首先,要回答爲什麼「刪除()」 不是從管理調用。這種說法是:

  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