如何从Django管理界面调用外部脚本?
我有一个Django的后台管理界面,主要用来作为一个图形界面,方便对一个PostgreSQL数据库表进行修改。现在还有一个Python脚本,每次数据库有变动时我都需要手动在命令行运行它。我想把这个脚本连接起来,让它在有人通过后台管理界面保存修改后自动运行。如果这是在views.py文件里的话,我可以把这个脚本当作一个模块导入,然后从视图中运行它的主函数(比如说,Django能否使用链接到其他库(如NumPy、RPy2)的“外部”Python脚本)。不过,我不太确定在后台管理界面该怎么做。
- admin.py和普通的views.py有什么相似和不同之处?
- 我应该把导入和调用外部脚本放在哪里?是在模型里,还是在admin.py里?
我对Python有点了解,但对“网页相关的东西”(比如Django这样的框架)还是比较陌生,有点搞不清楚我在问的问题是否很清楚,因为我对视图和模型的概念还有点模糊……
编辑:结果我其实通过阅读文档/教程找到了答案,但我以为后台管理的东西会有所不同。正如Keith在评论中提到的,我现在遇到了权限问题,不过这应该是另一个问题了。所以谢谢你们,也许我该停止自我怀疑了……
2 个回答
你可以考虑在你的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()
一般来说,你希望在“保存”时发生的事情可以分为两种情况:
属于模型的一部分。
如果是这样,你需要重写模型的
save
方法:http://docs.djangoproject.com/en/1.3/ref/models/instances/#saving-objects在这个
save
方法里,你可以做任何事情。属于视图函数的一部分。
如果是这样,你可以扩展管理界面(这不是很简单),或者自己写一个。