Django 1.2: Как подключить сигнал предварительного сохранения к методу класса

Я пытаюсь определить метод "before_save" в некоторых классах в моем проекте django 1.2. У меня возникли проблемы с подключением сигнала к методу класса в models.py.

class MyClass(models.Model):
    ....
    def before_save(self, sender, instance, *args, **kwargs):
        self.test_field = "It worked"

Я попытался поставить pre_save.connect (before_save, sender= 'self') в самом "MyClass", но ничего не происходит.

Я также попытался положить его в нижней части models.py файл:

pre_save.connect(MyClass.before_save, sender=MyClass)

Я читал о подключении сигналов к методам класса здесь, но не могу разгадать код.

3 ответов


вместо того, чтобы использовать метод в MyClass, вы должны просто использовать функцию. Что-то вроде:

def before_save(sender, instance, *args, **kwargs):
    instance.test_field = "It worked"

pre_save.connect(before_save, sender=MyClass)

пример работы с classmethod:

class MyClass(models.Model):
    #....
    @classmethod
    def before_save(cls, sender, instance, *args, **kwargs):
        instance.test_field = "It worked"

pre_save.connect(MyClass.before_save, sender=MyClass)

есть также отличный декоратор для автоматической обработки сигнальных соединений:http://djangosnippets.org/snippets/2124/


Я знаю, этот вопрос старый, но я искал ответ на это сегодня утром, так почему бы и нет. Кажется, из вашего кода Вы действительно хотели использовать метод экземпляра (из self и назначение поля). DataGreed обратился к тому, как использовать его для метода класса, и использование сигналов с методами экземпляра довольно похоже.

class MyClass(models.Model)

    test_field = models.Charfield(max_length=100)

    def __init__(self, *args, **kwargs):
        super(MyClass, self).__init__(*args, **kwargs)
        pre_save.connect(self.before_save, sender=MyClass)

    def before_save(self, sender, instance, *args, **kwargs):
        self.test_field = "It worked"

Я не уверен, что это хорошая идея или нет, но это было полезно, когда мне нужен метод экземпляра, вызываемый объектом класса A перед сохранением из класса B.