2015-10-12 40 views
0

我正在使用我的第一個Django網站,並將網站的獨立部分分解爲不同的應用程序。有一個基本的應用程序(我將其稱爲MainApp用於此問題),其他應用程序依賴於此應用程序(我將稱其爲依賴應用程序AppX,AppY和AppZ)。 MainApp提供了一些我希望依賴應用程序貢獻的視圖,但是我不確定如何在不使MainApp依賴於AppX,AppY和AppZ的情況下執行此操作。如何使用不同的應用程序中的代碼增強一個Django應用程序中的視圖

假設MainApp在URL/MainApp/TheView /上有一個視圖。 Django是否提供了可用作「掛鉤」的機制,以便App [XYZ]可以將額外的內容注入到/ MainApp/TheView /?即是否有創建MainApp視圖的方法,以便可以通過其他任意應用輕鬆擴展MainApp視圖?

+0

好的,我相信我能理解你的問題是什麼。 我看到的唯一方法是,一旦MainApp完成了它可以做的任何事情,那麼你可以重定向到AppX或AppY的url,但這樣做會改變客戶端視圖。 如果您不希望發生這種情況,但可能希望將代碼的功能分開,那麼您可能必須在另一個文件中編寫單獨的函數。 還是最好的,您可以將AppX的功能作爲cron作業,就像使用Celery一樣。 最終,沒有理由不創建不同的應用程序,除非每個應用程序都有自己的URL和視圖映射。 –

回答

0

這裏是我落得這樣做:

首先我增加了一個extra_content_providers屬性在MainApp視圖類。它將包含對額外內容提供者的引用。 get方法獲取額外的內容並將其傳遞給模板。 ,AppX中定義它的貢獻這樣

def spamview_content_provider(f): 
    SpamView.extra_content_providers.append(f) 
    return f 

最後:

class SpamView(View): 
    extra_content_providers = [] 
    def get(self, request, ...): 
     ... 
     extra_content = "" 
     for provider in self.extra_content_providers: 
      extra_content += provider(...) 
     params = {..., 'extra_content': extra_content} 
     return render(request, 'example.html', params) 

然後我定義了一個裝飾視圖類旁邊

from MainApp.views import spamview_content_provider 

@spamview_content_provider 
def x_content(...): 
    return "Hello, I'm X." 

這是一個普通老式的Python解決方案,它允許App [XYZ]爲MainApp視圖提供額外的內容,而不會引入任何新的應用程序間依賴關係。

相關問題