使 Django 信号特定于管理员保存

Lea*_*nIT 7 python django

我目前正在一个 Django 网站上工作。我想弄清楚如何制作仅当我从 Django Admin 保存时才激活的 post_save 信号。

现在,我已经做了一个 post_save 函数。这适用于所有意图和目的,但我的另一部分代码使用 .save() 更新主事件模型中的整数(整数表示提交的书籍数量)。

我更新用户加载事件页面时提交的书籍数量。

当用户尝试访问包含所有先前事件的页面时,这会导致加载时间过长,因为它会为页面上的每个项目运行我的“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)
Run Code Online (Sandbox Code Playgroud)

我想做的是让我当前的 save_post 函数仅在我点击 Django 管理员的“保存”按钮时运行。

我想避免覆盖保存功能,因为我读到它是不推荐的。

已解决:供将来参考,已接受的答案所建议的解决方案非常有效。我能够从 Django 管理仪表板中隔离保存实例。

Har*_*han 9

我不知道,这是推荐的方法,但你可以做的是创建一个自定义ModelAdminsave_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)
Run Code Online (Sandbox Code Playgroud)

然后我们可以检查是否设置post_savefrom_admin_siteattr 的信号。如果设置,则从管理站点保存。

@receiver(post_save, sender=Event)
def save_post(sender, instance, **kwargs):
    if getattr(instance, 'from_admin_site', False):
        // Todo
Run Code Online (Sandbox Code Playgroud)