Django可插拔动态导航应用程序

时间:2014-05-01 10:03:53

标签: python django architecture navigation decoupling

我想将我的大Django应用程序分离到多个应用程序中。但是有一个问题:导航。每个应用程序都应该能够添加自己的菜单项,留下其他应用程序'导航可见。

我认为使用块扩展的简单模板是不可能的。可能的解决方案可能是单独的导航应用程序,其他应用程序可以注册其菜单项。 我不想通过管理界面手动创建菜单项。我想要这样的东西:

# in users app:
import navapp
navapp.register(view_name='users_summary', path=('Home', 'Users'))
navapp.register(view_name='user_search', path=('Search', 'User'))
...

# in another app:
import navapp
navapp.register(view_name='other_stuff', path=('Home', 'Other stuff'))
navapp.register(view_name='about', path=('About',)
...

base.html中:从navapp导入一个templatetag并以某种方式使用它来渲染菜单。

当然,我的例子是简化的(例如,我故意省略菜单项的排序,虽然这很重要),但我希望它传达了这个想法。

为此目的,是否已有可重复使用的应用程序?如果没有,实施它的最佳方法是什么?


我发现了一个类似的问题:http://answers.splunk.com/answers/125820/single-navigation-for-multiple-apps

我想要的是django cms menu integration,但我不想惹恼django-cms。我需要一个小应用程序。

1 个答案:

答案 0 :(得分:1)

我的解决方案是添加一个installed_apps context_preprocessor:

from django.conf import settings

def installed_apps(request):
    return {'INSTALLED_APPS': settings.INSTALLED_APPS}


TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    "baseapp.context_processors.installed_apps",
    ...
)

然后在模板中,如果应用程序处于INSTALLED_APPS

,我可以添加一个nav元素
{% if 'app' in INSTALLED_APPS %}
  <li><a href="/app">APP</a></li>
{% endif %}