这是我的信号:
def deactivate_users_by_default(sender, user, created, **kwargs):
print sender, user, created
if created:
user.is_active = False
user.save()
signals.post_save.connect(deactivate_users_by_default, sender=User, dispatch_uid="deactivate_users_by_default")
当我通过管理面板或 auth.login View 登录时,我得到:
response = receiver(signal=self, sender=sender, **named)
TypeError: deactivate_users_by_default() takes exactly 3 arguments (2 given)
我做错了什么?
最佳答案
有点隐蔽in the documentation ,但只有 sender
作为位置参数传递给信号接收器。所有其他参数(包括模型信号的 instance
参数)作为关键字参数传递:
Notice that the function takes a sender argument, along with wildcard keyword arguments (
**kwargs
); all signal handlers must take these arguments.
这里隐含的断言是信号处理程序的所有非发送者参数都作为关键字参数传递。
user
与提供给 post_save
的任何关键字都不匹配并且接收方没有传递位置参数来匹配它,因此出现错误消息。
将 deactivate_users_by_default
重新声明为
def deactivate_users_by_default(sender, instance, created, **kwargs):
解决了你的问题。
关于python - 用户登录时Django postsave信号丢失参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41901405/