Python 在Django中,如何创建可重用的接收器函数?

Python 在Django中,如何创建可重用的接收器函数?,python,django,python-decorators,django-signals,Python,Django,Python Decorators,Django Signals,我有一个模型SessionType,其中有一个字段title,我想创建一个slagified版本,smattering\u slug。目前,这是通过以下接收器功能实现的: from django.db.models.signals import pre_save from django.dispatch import receiver from django.utils.text import slugify @receiver(pre_save, sender=SessionType) d

我有一个模型
SessionType
,其中有一个字段
title
,我想创建一个slagified版本,
smattering\u slug
。目前,这是通过以下接收器功能实现的:

from django.db.models.signals import pre_save
from django.dispatch import receiver
from django.utils.text import slugify


@receiver(pre_save, sender=SessionType)
def create_smattering_slug(sender, instance, **kwargs):
    if not instance.smattering_slug:
        instance.smattering_slug = slugify(instance.title)
但是,我也有其他的模型,我想对它们做同样的事情,但是要缓冲的字段和缓冲字段的名称是不同的

为了概括这一点,我考虑过这样做:

def create_slug_field(sender, instance, **kwargs):
    field = kwargs.pop('field')
    slug_field = kwargs.pop('slug_field')

    if not getattr(instance, slug_field):
        setattr(instance, slug_field, slugify(field))


from functools import partial
pre_save.connect(partial(create_slug_field, field='title', slug_field='smattering_slug'))
但是,通过这种方式,我没有像原始示例中那样传入
sender=SessionType
。(我不清楚在使用
.connect()
时如何执行此操作)

另外,我想使
字段
slug\u字段
成为必需的参数,但我不太明白这是如何工作的,因为处理程序似乎期望中描述的一组固定参数

如何以“可扩展”的方式实现此接收器

更新

从中,它似乎接受一个可选的
sender
参数,但当我将上面的示例改编为

pre_save.connect(
    sender=SessionType,
    receiver=partial(create_slug_field, field='title', slug_field='smattering_slug'))

并在
create\u slug\u字段
函数中设置一个跟踪,该跟踪不会导致Python进入调试器,这意味着该函数不会被调用!在这种情况下,我的“通用”版本如何与原始版本不同?

它必须是信号处理程序吗?您可以在
模型
子类中重写
保存
方法,并扩展该方法。然后可以将字段名作为模型类的属性。我的CTO说他更喜欢信号处理程序而不是重写
save()
方法。我基本上是在尝试实现中的高级描述。您仍然可以在模型类中定义一个属性,并在信号处理程序中使用它,即
实例。slug\u field\u name
。是的,这就是我的意思。在您的模型中添加
slug\u字段\u name='name\u slug'
(可能是
Meta
?),然后使用处理程序中的值。
pre\u save.connect
,而不使用sender参数吗?如果是这样的话,
create\u slug\u field
可以自行挑选正确的发送者。您是否验证了任何信号是否有效(因为我看不出您更新的信号有任何问题)。