2011-12-30 194 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