Django编写信号触发TypeError: 意外关键字参数'model_name'如何解决
报错原因
- 核心参数匹配错误:你在
create_payment_record信号函数中调用Payment_record.objects.create()时,传入的关键字参数是Payment=instance,但Payment_record模型中关联Payment的外键字段命名为student_name,字段名不匹配导致参数无法被识别。 - 冗余信号逻辑错误:你写的第二个
save_payment_record信号完全多余且存在多处错误:Payment实例反向关联Payment_record的属性名是你在外键中定义的related_name="pay_date_record",不存在instance.Payment_record这个属性- 即使属性正确,你写的
save没有加括号,并不会实际执行保存方法 - 创建
Payment_record实例时调用create()方法已经自动完成保存,不需要额外触发保存逻辑
- 额外的
model_name报错通常是因为信号注册逻辑异常,大概率是你INSTALLED_APPS中没有正确配置带全路径的FinancesConfig,导致ready方法没有按预期执行。
修复方案
1. 修正signals.py代码
直接删除多余的保存信号,仅保留创建逻辑,修改参数字段名即可:
from .models import Payment_record, Payment from django.db.models.signals import post_save from django.dispatch import receiver @receiver(post_save, sender=Payment) def create_payment_record(sender, instance, created, **kwargs): if created: # 外键字段名是student_name,对应传入Payment实例 Payment_record.objects.create(student_name=instance)
2. 检查settings.py配置
确保INSTALLED_APPS中配置的是全路径的AppConfig,否则信号不会生效:
INSTALLED_APPS = [ # 其他应用配置 'finances.apps.FinancesConfig', ]
3. 可选优化
你当前的Payment_record模型中外键字段命名为student_name但实际关联的是Payment实例,命名容易产生歧义,建议修改为更贴合语义的名称比如payment,同步修改信号中的参数即可。
内容的提问来源于stack exchange,提问作者Gitau Wairimu
相关产品推荐
相关产品推荐

