我正在开发我的第一个Django网站,并且我已经将网站的独立部分分解为不同的应用程序。有一个基本的应用程序(我将其称为MainApp用于此问题的目的),其他应用程序依赖于该应用程序(我将称为依赖应用程序AppX,AppY和AppZ)。 MainApp提供了一些我希望依赖应用程序贡献的视图,但我不确定如何在不使MainApp依赖于AppX,AppY和AppZ的情况下如何做到这一点。
假设MainApp在URL / MainApp / TheView /上有一个视图。 Django是否提供任何可用作“钩子”的机制,以便App [XYZ]可以将其他内容注入/ MainApp / TheView /?即有没有办法创建MainApp视图,以便其他任意应用程序可以轻松扩展它们?
答案 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视图提供额外的内容,而不会引入任何新的应用程序间依赖关系。