如何使用不同的应用程序中的代码增强一个Django应用程序中的视图

时间:2015-10-12 22:22:37

标签: django-templates django-views

我正在开发我的第一个Django网站,并且我已经将网站的独立部分分解为不同的应用程序。有一个基本的应用程序(我将其称为MainApp用于此问题的目的),其他应用程序依赖于该应用程序(我将称为依赖应用程序AppX,AppY和AppZ)。 MainApp提供了一些我希望依赖应用程序贡献的视图,但我不确定如何在不使MainApp依赖于AppX,AppY和AppZ的情况下如何做到这一点。

假设MainApp在URL / MainApp / TheView /上有一个视图。 Django是否提供任何可用作“钩子”的机制,以便App [XYZ]可以将其他内容注入/ MainApp / TheView /?即有没有办法创建MainApp视图,以便其他任意应用程序可以轻松扩展它们?

1 个答案:

答案 0 :(得分:0)

这是我最终做的事情:

首先,我在MainApp的视图类中添加了 extra_content_providers 属性。它将包含对额外内容提供者的引用。 get方法获取额外内容并将其传递给模板。

class SpamView(View):
    extra_content_providers = []
    def get(self, request, ...):
        ...
        extra_content = ""
        for provider in self.extra_content_providers:
            extra_content += provider(...)
        params = {..., 'extra_content': extra_content}
        return render(request, 'example.html', params)

然后我在视图类旁边定义了一个装饰器:

def spamview_content_provider(f):
    SpamView.extra_content_providers.append(f)
    return f

最后,AppX以这种方式定义了它的贡献:

from MainApp.views import spamview_content_provider

@spamview_content_provider
def x_content(...):
    return "Hello, I'm X."

这是一个普通的Python解决方案,它允许App [XYZ]为MainApp视图提供额外的内容,而不会引入任何新的应用程序间依赖关系。