Django模板上下文多个视图

时间:2011-12-30 20:49:44

标签: django templates views pip django-context

我正在运行Idios, a profile app,我想在我的app中创建个人资料(即保持idios pip-installable,而无需修改应用程序本身)。

问题是,配置文件视图是在idios应用程序中编写的,使用面向对象的方法传递上下文变量,并在模板中显示该视图。我希望个人资料视图还包含一个用户朋友的列表,由一个单独的朋友应用管理。我只是通过将朋友导入Idios并使用新的friend_list变量更新上下文并添加另一个模板块来显示朋友列表,从而获得了概念验证。

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

3 个答案:

答案 0 :(得分:3)

值得庆幸的是,提到的应用程序使用基于类的视图,这是使用基于类的视图获得的好处。要修改上下文,只需创建其配置文件视图的子类:

<强> 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

然后,只需在urls.py中重新定义urlpattern idios默认使用(需要在包含idios urlpatterns之前去)并将其指向您的子类

最后,通过在项目(或应用程序)idios/whatever_template.html目录中创建templates文件来覆盖模板idios使用。复制默认模板并随意修改。由于Django提供的所有覆盖功能,您无需实际触摸原始源。

答案 1 :(得分: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

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

答案 2 :(得分:0)

如果您认为自己可能希望在其他观看中包含用户的朋友,那么干嘛的方式就是创建custom template tag or filter。然后你只需要覆盖模板,并在那里包含你的模板标签/过滤器。

如果您只想在此特定视图中显示用户的朋友,那么我会覆盖get_context_data,如其他答案中所述。