如何从Django管理界面调用外部脚本?

0 投票
2 回答
2158 浏览
提问于 2025-04-16 16:27

我有一个Django的后台管理界面,主要用来作为一个图形界面,方便对一个PostgreSQL数据库表进行修改。现在还有一个Python脚本,每次数据库有变动时我都需要手动在命令行运行它。我想把这个脚本连接起来,让它在有人通过后台管理界面保存修改后自动运行。如果这是在views.py文件里的话,我可以把这个脚本当作一个模块导入,然后从视图中运行它的主函数(比如说,Django能否使用链接到其他库(如NumPy、RPy2)的“外部”Python脚本)。不过,我不太确定在后台管理界面该怎么做。

  • admin.py和普通的views.py有什么相似和不同之处?
  • 我应该把导入和调用外部脚本放在哪里?是在模型里,还是在admin.py里?

我对Python有点了解,但对“网页相关的东西”(比如Django这样的框架)还是比较陌生,有点搞不清楚我在问的问题是否很清楚,因为我对视图和模型的概念还有点模糊……

编辑:结果我其实通过阅读文档/教程找到了答案,但我以为后台管理的东西会有所不同。正如Keith在评论中提到的,我现在遇到了权限问题,不过这应该是另一个问题了。所以谢谢你们,也许我该停止自我怀疑了……

2 个回答

1

你可以考虑在你的ModelAdmin里定义一个save_model的方法。这个方法会在有人从管理后台保存数据时执行(但在其他地方保存时不会执行)。这个做法可能会根据你的需求有所不同,但在从管理后台保存数据时,它应该能给你提供必要的操作点。

在admin.py文件中

class MyModelAdmin(admin.ModelAdmin):

    model = models.MyModel

    def save_model(self, request, obj, form, change):

        # you can put custom code in here
        obj.save()
2

一般来说,你希望在“保存”时发生的事情可以分为两种情况:

  1. 属于模型的一部分。

    如果是这样,你需要重写模型的 save 方法:http://docs.djangoproject.com/en/1.3/ref/models/instances/#saving-objects

    在这个 save 方法里,你可以做任何事情

  2. 属于视图函数的一部分。

    如果是这样,你可以扩展管理界面(这不是很简单),或者自己写一个。

撰写回答