python - 用户登录时Django postsave信号丢失参数

标签 python django

这是我的信号:

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/

相关文章:

mysql - 尝试用 MySQL 和进程理解 Django select_for_update()

python - 一个项目的 Django 多重身份验证后端

Django - 如何在自定义过滤器中将 "or"条件添加到 queryset.filter

python - 为什么不能 select.select() 捕获关闭的套接字错误?

python - 无法在 Python 2 中打印 Unicode 比特币符号

java - 是否可以从我的程序中编辑预先存在的 .class 文件?

django - 在 Django 中获取不同的随机查询集

python - 在 Django 中使用带有外键的模型的正确方法

python - 覆盖多维数组的 setter

python - 为什么 StringField 总是 None ?