2011-01-27 69 views
5

我想知道是否有可能在創建對象時選擇性地抑制Django信號(例如post_savepost_init),或者發送特定參數。是否可以選擇性地抑制Django中的post_save(或其他)信號?

我所擁有的是一個User對象,它可以在我的代碼中以多種不同的方式創建。因此,要自動爲每個User分配一個自定義對象Profile,我使用post_save信號。但是,在一個特定情況下,我想綁定額外的信息以綁定到創建的Profile對象。將它作爲參數傳遞給post_save信號會很好,但看起來不太可能。

另一種選擇是手動創建Profile對象,但我需要的是User保存後,否則Profile不能被綁定到User實例。然而,保存User實例會導致通過信號調用的函數創建另一個Profile

我不能剛剛創建的Profile對象,因爲這會導致'Profile' object is unsubscriptable錯誤。有什麼建議?

更新:

這裏是一個可能的情況的例子:

def createUserProfile(sender, instance, created, **kwargs): 
if created: 
    profile, created = Profile.objects.get_or_create(user=instance) 
    if extra_param: 
     profile.extra_param = extra_param 
    profile.save() 

post_save.connect(createUserProfile, sender=User) 

def signup(request): 
    ... 
    extra_param = 'param' 
    user.save() 

如何獲取變量extra_paramsignup方法將createUserProfile方法,它是將存儲作爲Profile對象的一部分?

+1

+1。我很想知道這個答案。 – PeanutButterJelly 2011-01-27 18:54:46

回答

2

爲什麼這不適用於您?

user = User(...) 
user.save() 
# profile has been created transparently by post_save event 
profile = user.profile 
profile.extra_stuff = '...' 
profile.save() 

如果您正在使用的參數傳遞給事件,可能的,但邪惡的癡迷:

user = User() 
user._evil_extra_args = { ... } 
user.save() 

In event: 
extra_args = getattr(user, '_evil_extra_args', False) 

它是邪惡的,因爲人們誰將會閱讀你的代碼將不知道究竟發生了什麼那些_evil_extra_args是和它是如何工作的。

0

延遲post_save是不可能的(除非你想要entirely disconnect it),但它們都不是必需的。將參數傳遞給配置文件根本不是問題:

class UserProfile(models.Model): 
    user = models.ForeignKey(User) 
    other = models.SomeField() 

def create_user_profile(sender, instance, created, other_param=None, **kwargs): 
    if created: 
     profile, created = UserProfile.objects.get_or_create(user=instance) 
     profile.other(other_param) # or whatever 
     profile.save() 

post_save.connect(create_user_profile, sender=User, other_param=p) 
+0

如果我只想在一種情況下發送該參數,並且`post_save.connect`被定義在創建`User`對象本身的函數之外的某處?這將如何工作? – 2011-01-27 14:55:37

+0

只是給它一個默認值...(編輯答案) – 2011-01-27 14:56:37