# decorators.py
from functools import wraps
from django.db.models.signals import pre_save
from django.db.models.signals import post_save
def autoconnect(cls):
"""
Class decorator that automatically connects pre_save / post_save signals on
a model class to its pre_save() / post_save() methods.
"""
def connect(signal, func):
cls.func = staticmethod(func)
@wraps(func)
def wrapper(sender, **kwargs):
return func(kwargs.get('instance'))
signal.connect(wrapper, sender=cls)
return wrapper
if hasattr(cls, 'pre_save'):
cls.pre_save = connect(pre_save, cls.pre_save)
if hasattr(cls, 'post_save'):
cls.post_save = connect(post_save, cls.post_save)
return cls
#---------
# Example usage
@autoconnect
class MyModel(models.Model):
foo = CharField(max_length=10,null=True,blank=True)
bar = BooleanField()
def pre_save(self):
if self.foo is not None:
self.bar = True
Comments
great snippet
#