4

我正在运行Idios,一个配置文件应用程序,我想在我的应用程序中在 idios 上创建配置文件(即保持 idios pip 可安装,而不修改应用程序本身)。

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

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

4

3 回答 3

3

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

你的应用程序/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 中重新定义 idios 默认使用的 urlpattern (需要在包含 idios urlpatterns 之前进行)并将其指向您的子类

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

于 2011-12-30T21:50:34.423 回答
1

您应该能够通过ProfileDetailView在项目的应用程序中从 idios 创建该类的子类,并为该用户的朋友添加额外的上下文来做到这一点。像这样的东西:

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

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

于 2011-12-30T21:45:34.560 回答
0

如果您认为您可能还希望在其他视图中包含用户的朋友,那么 DRY 方法是创建自定义模板标签或过滤器。然后你只需要覆盖模板,并在那里包含你的模板标签/过滤器。

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

于 2011-12-30T22:12:57.357 回答