2012-02-20 11 views
5

を削除私はまたUser項目を削除でしょうUserProfile(ユーザーから延びている)を作成し、私は(管理エリアから)UserProfileを削除するとsettings.py削除ユーザーのUserProfile

AUTH_PROFILE_MODULE = 'mainapp.UserProfile'. 

に書き込まれました。

私はユーザー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. 。 /管理/認証/ユーザー/アクション]をクリックし、その後、いくつかのチェックボックスをオン - 、クエリセットのdelete()メソッドが呼び出されているので>削除)、これはchange_formからオブジェクトを削除した場合の間違った
  2. すなわち、 /管理/認証/ユーザー/ 1 /削除]をクリックしますが、これはオブジェクトのdelete()メソッドが_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の、これは両方の方法を動作します3210

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、送信者=のUserProfile)書かれたとき、私はまたmainapp.modelsから を記述する必要がありますがのUserProfile をインポートして、私が登録したとき - エラー IntegrityErrorは/ 重複キーを登録/アカウント/で言います値が一意の制約に違反しています "mainapp_userprofile_user_id_key" – yAnTar

+0

別のトピックを開き、詳細(コード)を追加できますか?私はあなたのコメントを非常によく理解していません...あらかじめありがとう – jpic

+0

申し訳ありません、すべてが大丈夫です、私は信号ファイルからファイルsignals.pyに信号を移動し、うまく動作します。 – yAnTar

関連する問題