Django模板上下文多视图

Django模板上下文多视图,django,templates,views,pip,django-context,Django,Templates,Views,Pip,Django Context,我正在运行,我想让我的应用程序中的配置文件位于idos之上(即保持idos pip可安装,而不修改应用程序本身) 问题是,概要视图是在idos应用程序中编写的,使用面向对象的方法传递上下文变量,并在模板中显示该视图。我希望个人资料视图也包括一个用户的朋友列表,由一个单独的朋友应用程序管理。我得到了一个概念证明,只需将好友导入到idos中,并使用一个新的friend_list变量更新上下文,然后添加另一个模板块来显示好友列表 那么,在不改变idos应用程序的情况下,将好友列表和个人资料结合起来的最

我正在运行,我想让我的应用程序中的配置文件位于idos之上(即保持idos pip可安装,而不修改应用程序本身)

问题是,概要视图是在idos应用程序中编写的,使用面向对象的方法传递上下文变量,并在模板中显示该视图。我希望个人资料视图也包括一个用户的朋友列表,由一个单独的朋友应用程序管理。我得到了一个概念证明,只需将好友导入到idos中,并使用一个新的friend_list变量更新上下文,然后添加另一个模板块来显示好友列表


那么,在不改变idos应用程序的情况下,将好友列表和个人资料结合起来的最佳或最明智的方法是什么呢?这个问题基本上是请求帮助以一种干巴巴的方式真正理解Django中支持可重用应用程序的MVT系统。

您应该能够通过在项目中的应用程序中从idos创建
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

然后,您可以将此子类用作项目中的视图。

谢天谢地,上面提到的应用程序使用基于类的视图,这就是使用基于类的视图的好处。要修改上下文,只需创建其纵断面图的子类:

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
然后,只需在url.py中重新定义idos默认使用的urlpattern(需要在包含idos urlpatterns之前进行),并将其指向您的子类即可


最后,通过在项目(或应用程序)的
templates
目录中创建
idos/which_template.html
文件来覆盖idos使用的模板。复制默认模板并随意修改。多亏了Django提供的所有覆盖,您根本不需要实际接触原始源代码。

如果您认为您可能希望在其他视图中也包括用户的朋友,一个简单的方法就是创建一个新的视图。然后,您只需覆盖模板,并在其中包含模板标记/过滤器


如果你只想在这个特定的视图中显示用户的朋友,那么我会覆盖其他答案中描述的
get\u context\u data

太好了,你们都帮了大忙,这个描述有更多的细节,所以我选择了它,但两者都足够了。我知道面向对象方法有它的优点,而且它太简单了,我看不出来:类继承!很好,我想就提出问题的方式而言,上述解决方案已经足够了。你的超级干燥方法是有道理的。上面的方法很好,因为我需要对idos profile应用程序进行其他更改,所以我将在我自己的应用程序中完成所有这些,构建子类视图等等。下一步(我将添加为一个问题)是进一步抽象好友视图,以便跨多个应用程序使用,而不仅仅是idos个人资料。