6

我想知道是否可以在对象创建时选择性地抑制 Django 信号(例如post_savepost_init),或者,向其发送某些参数。

我拥有的是一个User对象,它可以在我的代码中以多种不同的方式和位置创建。因此,为了自动Profile为每个对象分配一个自定义对象User,我使用了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_param传递signup给 createUserProfile 方法,并将其作为Profile对象的一部分存储在哪里?

4

2 回答 2

1

为什么这对你不起作用?

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 到底是为了什么以及它是如何工作的。

于 2011-01-28T00:10:55.140 回答
0

延迟post_save是不可能的(除非您想完全断开它),但也没有必要。将参数传递给配置文件根本不是问题:

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)
于 2011-01-27T14:50:48.433 回答