如何在基于 django class 的视图中 运行 python 编写脚本?

How to run python script in a django class-based view?

我的 Django 应用 models.py 具有以下 class:

class Project(models.Model):
    name = models.CharField(max_length=100)
    ...

我正在使用基于 class 的视图,因此我的 views.py 文件具有以下 class:

from django.views import generic
from django.views.generic.edit import CreateView

class ProjectCreate(CreateView):
    model = Project
    fields = ['name']

HTTP 表单完美运行并在数据库中创建了一个新元素,但我需要在创建 class [的新实例时从外部 python 文件调用一个函数=18=],我尝试 运行 的代码是:

import script
script.foo(self.object.name)

我正在尝试 运行 class ProjectCreate 中的函数 foo 但我一无所知,我尝试使用 getdispatch 方法,但它没有用,我已经阅读了 CreateView 的文档,但我找不到我的答案。

我应该使用基于函数的视图吗?或者是否有基于 class 的视图的解决方案?

非常感谢。

如果你想 运行 你的函数只在视图中 class 你可以简单地覆盖 form_valid 方法:

class ProjectCreate(CreateView):
    model = Author
    fields = ['name']

    def form_valid(self, form):
        result = super().form_valid(form)
        script.foo(self.object.name)
        return result

如果您想 运行 在每个实例创建后使用该函数,您可以使用 signals or override model methods

您可能希望在模型保存方法中执行此操作,而不是在视图中执行此操作,因此每当创建新实例时都会调用它:

class Project(models.Model):
    ...
    def save(self, *args, **kwargs):
        if not self.pk:
            script.foo(self)
        return super(Project, self).save(*args, **kwargs)

如果您确定只想从那个视图执行此操作,那么您可以改写该视图的 form_valid 方法:

class ProjectCreate(CreateView):
    def form_valid(self, form):
        response = super(ProjectCreate, self).form_valid(form)
        script.foo(self.object)
        return response