2011-12-30 307 views
3

我正在運行Idios, a profile app,我想在我的應用程序頂端的idios(即保持idios pip-installable,不需要修改應用程序本身)的配置文件。Django模板上下文多個視圖

問題是,配置文件視圖是在idios應用程序中編寫的,使用傳遞上下文變量的面向對象的方法,並在模板中顯示該視圖。我希望配置文件視圖還包含由單獨的朋友應用管理的用戶朋友列表。我僅通過將朋友導入Idios並使用新的friend_list變量更新上下文並添加另一個模板塊來顯示好友列表來獲得概念驗證。

那麼,在不改變idios應用程序的情況下,結合朋友列表和個人資料的最佳方法或最理智的方法是什麼?這個問題基本上是幫助確實瞭解Django中的MVT系統以支持可重用應用程序的DRY方式。

回答

2

幸運的是,所提到的應用程序使用基於類的視圖,這是您從使用基於類的視圖中獲得的好處。要修改的情況下,你只是創建他們的個人資料視圖的一個子類:

yourapp/views.py

from idios.views import ProfileDetailView 

class MyProfileDetailView(ProfileDetailView): 
    def get_context_data(self, **kwargs): 
     context = super(MyProfileDetailView, self).get_context_data(**kwargs) 

     # get the list of friends and store it in a new key in `context` 

     return context 

然後,只需重新定義URLPATTERN idios在urls.py默認情況下使用(需要URL模式包括在idios之前去),並將其指向你的子類,而不是

最後,覆蓋模板idios通過創建idios/whatever_template.html文件在您的項目(或應用程序的)templates目錄使用。複製默認模板並隨意修改。由於Django提供的所有重寫功能,您根本不必實際觸及原始源代碼。

+0

太好了,你們都幫了很多忙,這個描述有一些細節,所以我選了它,但都足夠了。我知道面向對象的方法是有優勢的,它非常簡單,我看不到它:類繼承! – wrought 2011-12-30 22:58:45

+0

哦,我只是用這種方式來實現它,完美地工作。 – wrought 2011-12-30 23:00:43

1

您應該可以通過在項目中的應用程序中創建idios的ProfileDetailView類的子類來實現,併爲該用戶的朋友添加額外的上下文。例如:

import idios.views 

class ProfileDetailView(idios.views.ProfileDetailView): 

    def get_context_data(self, **kwargs): 
     context = super(ProfileDetailView, self).get_context_data(**kwargs) 
     context['friends'] = get_friends(self.page_user) # Or however it works 
     return context 

然後,您可以將此子類用作項目中的視圖。

0

如果您認爲您也可能希望在其他視圖中包含用戶的朋友,那麼DRY的方法是創建一個custom template tag or filter。然後,您只需重寫模板,並在其中包含模板標記/過濾器。

如果您只想在此特定視圖中顯示用戶的朋友,那麼我將覆蓋get_context_data,如其他答案中所述。

+0

好的,我想這個問題提出的方式,上面的解決方案是足夠的。你的super-DRY方法雖然有意義。 – wrought 2011-12-30 23:00:24

+0

上面的方法很好,因爲我需要對idios配置文件應用程序進行其他更改,所以我將在我自己的應用程序中完成所有這些工作,構建子類視圖等。下一步(我將添加爲一個問題)是爲了跨多個應用程序進一步抽象朋友視圖,而不僅僅是idios配置文件。 – wrought 2011-12-30 23:02:20