Django сигналы работает даже для Django - администратора, когда написано для модели - PullRequest
0 голосов
/ 04 сентября 2018
class Leave(models.Model):

    employee_ID = models.CharField(max_length = 20)
    name = models.CharField(max_length = 50)
    user = models.ForeignKey(User, on_delete = models.CASCADE, null =True)

def create_form(sender, instance, created, **kwargs):
    print('form sent')

post_save.connect(receiver = create_form, sender= Leave)

Я написал сигнал post_save для моей модели, так что каждый раз, когда ModelForm сохраняется, он печатает form sent, но то же самое происходит, если я изменяю некоторые поля в /admin и save , Как мне это остановить и написать еще один signal, если администратор изменяет любое поле.

Я пробовал это для администратора, но это не работает

from django.contrib import admin
def admin_alter(sender, instance, created, **kwargs):
    if Leave.status == '1':
        print('admin altered')

post_save.connect(receiver = after_accepting, sender= admin)

1 Ответ

0 голосов
/ 04 сентября 2018

Первая точка: сигналы для связи между приложениями. Суть в том, чтобы приложение B могло получать информацию о событиях, происходящих в приложении A, без необходимости каким-либо образом изменять A. Здесь вы работаете в одном и том же приложении, поэтому с использованием сигналов - это антипаттерн .

Второй момент: models.post_save отправляется всякий раз, когда вызывается метод save() экземпляра модели, откуда бы он ни вызывался - ваша собственная форма, администратор модели, команда управления и даже из интерактивной оболочки, поэтому Вы не можете иметь различные обработчики сигналов в зависимости от того, где была вызвана модель save().

Теперь решение довольно простое: не используйте сигналы, просто переопределите различные методы, вызывающие сохранение вашей модели (метод save() вашей формы, метод save() формы администратора и т. Д.) И добавьте любой код, который вы хотите эти точки.

...