2017-07-31 87 views
0

我的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但我一無所知,我嘗試使用getdispatch方法,但它沒有工作,我讀的CreateView的文檔,但我找不到我的答案。

我應該使用基於函數的視圖嗎?還是有基於類的視圖的解決方案?

非常感謝。

回答

1

你可能想這樣做模型保存方法中,而不是在看,所以每當一個新的實例被創建它會被稱爲:

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 
+0

非常好,非常感謝。 – Rand

0

如果你想只運行視圖類裏面的功能,你可以簡單地重寫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

相關問題