diff --git a/model_utils/fields.py b/model_utils/fields.py index a353f17f..2531edb3 100644 --- a/model_utils/fields.py +++ b/model_utils/fields.py @@ -54,14 +54,17 @@ def __init__(self, *args, **kwargs): self.check_for_status = not kwargs.pop('no_check_for_status', False) super(StatusField, self).__init__(*args, **kwargs) - def contribute_to_class(self, cls, name): - if not cls._meta.abstract and self.check_for_status: - assert hasattr(cls, 'STATUS'), \ + def prepare_class(self, sender, **kwargs): + if not sender._meta.abstract and self.check_for_status: + assert hasattr(sender, 'STATUS'), \ "To use StatusField, the model '%s' must have a STATUS choices class attribute." \ - % cls.__name__ - self._choices = cls.STATUS + % sender.__name__ + self._choices = sender.STATUS if not self.has_default(): - self.default = tuple(cls.STATUS)[0][0] # set first as default + self.default = tuple(sender.STATUS)[0][0] # set first as default + + def contribute_to_class(self, cls, name): + models.signals.class_prepared.connect(self.prepare_class, sender=cls) super(StatusField, self).contribute_to_class(cls, name) @@ -81,9 +84,13 @@ def __init__(self, *args, **kwargs): self.monitor = monitor super(MonitorField, self).__init__(*args, **kwargs) + def prepare_class(self, sender, **kwargs): + self.monitor_attname = '_monitor_%s' % self.name + models.signals.post_init.connect(self._save_initial, sender=sender) + def contribute_to_class(self, cls, name): - self.monitor_attname = '_monitor_%s' % name - models.signals.post_init.connect(self._save_initial, sender=cls) + self.name = name + models.signals.class_prepared.connect(self.prepare_class, sender=cls) super(MonitorField, self).contribute_to_class(cls, name) def get_monitored_value(self, instance):