如何在django基于类的视图中运行python脚本?
问题描述:
我的Django应用程序models.py
有以下类:如何在django基于类的视图中运行python脚本?
class Project(models.Model):
name = models.CharField(max_length=100)
...
我使用基于类的意见,让我views.py
文件有以下类:
from django.views import generic
from django.views.generic.edit import CreateView
class ProjectCreate(CreateView):
model = Project
fields = ['name']
的HTTP形式完美的作品,并创建一个新的元素,但我需要在创建Project
类的新实例时从外部python文件调用函数,我试图运行的代码是:
import script
script.foo(self.object.name)
我试图运行的类ProjectCreate
内部功能foo
但我一无所知,我尝试使用get
和dispatch
方法,但它没有工作,我读的CreateView的文档,但我找不到我的答案。
我应该使用基于函数的视图吗?还是有基于类的视图的解决方案?
非常感谢。
答
你可能想这样做模型保存方法中,而不是在看,所以每当一个新的实例被创建它会被称为:
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
答
如果你想只运行视图类里面的功能,你可以简单地重写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或覆盖model methods功能。
+0
谢谢,这解决了这个问题。但在模型类中重写'save()'函数似乎是一个更好的解决方案。 再次感谢您。 – Rand
非常好,非常感谢。 – Rand