Django 可插拔动态导航应用

2 投票
1 回答
739 浏览
提问于 2025-04-18 04:59

我想把我的大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 中:从导航应用导入一个模板标签,并用某种方式来渲染菜单。

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

有没有现成的应用可以实现这个功能?如果没有,最好的实现方法是什么呢?


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

我想要的功能类似于 django cms菜单集成,但我不想去搞复杂的django-cms。我只需要一个小应用就可以了。

1 个回答

1

我的解决办法是添加一个已安装应用的上下文处理器:

from django.conf import settings

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


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

然后在模板中,如果这个应用在已安装应用列表里,我就可以添加一个导航元素。

{% if 'app' in INSTALLED_APPS %}
  <li><a href="/app">APP</a></li>
{% endif %}

撰写回答