Делать сигналы Django специфичными только для администратора Сохранить - PullRequest
3 голосов
/ 04 мая 2019

В настоящее время я работаю над сайтом Django.Я хотел бы выяснить, как сделать сигнал post_save, который активируется ТОЛЬКО при сохранении из Django Admin.

Прямо сейчас я сделал функцию post_save.Это работает для всех намерений и целей, но другая часть моего кода использует .save () для обновления Integer в основной модели событий (целое число представляет количество отправленных книг).

Я обновляю количество книг, представленных пользователями, загружающими страницу событий.

Это приводит к очень длительному времени загрузки, когда пользователи пытаются получить доступ к странице со всеми предыдущими событиями, так как она запускает мою функцию "book_organizer" для каждого элемента на странице, когда мне нужно только запустить ее, когда я обновляю и сохраняю событиедетали прямо со страницы администратора.

@receiver(post_save, sender=Event)
def save_post(sender, instance, **kwargs):

    if instance.books_read==True:

        book_organizer.organize_it(instance)

post_save.connect(save_post, sender=Event)

Я хотел бы сделать так, чтобы моя текущая функция save_post запускалась ТОЛЬКО при нажатии кнопки «Сохранить» от администратора Django.

Я хотел бы избежать переопределения функции сохранения, так как я прочитал, что это не рекомендуется.

Решено: Для дальнейшего использования решение, предложенное в принятом ответе, работало как чудо.Мне удалось изолировать экземпляры сохранения из Django Admin Dashboard.

1 Ответ

3 голосов
/ 04 мая 2019

Я не уверен. Это рекомендуемый подход, но вы можете создать пользовательскую ModelAdmin с save_model функцией в admin.py

class FoobarModelAdmin(ModelAdmin):

    def save_model(self, request, obj, form, change):
        obj.from_admin_site = True #here we setting instance attribute which we check in `post_save`
        super().save_model(request, obj, form, change)

admin.site.register(Foobar, FoobarModelAdmin)

, тогда мы можем проверитьв post_save сигнал, что from_admin_site атрибут установлен или нет.если установлено, то оно сохраняется с сайта администратора.

@receiver(post_save, sender=Event)
def save_post(sender, instance, **kwargs):
    if getattr(instance, 'from_admin_site', False):
        // Todo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...