Django 根据已安装的应用程序添加导航链接

Django 根据已安装的应用程序添加导航链接,django,django-templates,Django,Django Templates,我有一个项目,有许多应用程序。这些应用程序转化为模块,为最终用户执行不同的功能 现在,项目的每个部署都可能启用或禁用某些应用程序 我想要实现的是一个链接导航列表,它只显示已安装应用程序中的应用程序的链接 例如,部署1在已安装的应用程序中列出了App1和App2,因此会有如下导航: 链接到App1的视图 链接到App2的视图 部署2安装了App2和App3,因此应该显示如下导航: 链接到App2的视图 链接到App3的视图 如果没有在基本模板中定义导航并为每个部署编辑它,我就看不到这样做的

我有一个项目,有许多应用程序。这些应用程序转化为模块,为最终用户执行不同的功能

现在,项目的每个部署都可能启用或禁用某些应用程序

我想要实现的是一个链接导航列表,它只显示已安装应用程序中的应用程序的链接

例如,部署1在已安装的应用程序中列出了App1和App2,因此会有如下导航:

  • 链接到App1的视图
  • 链接到App2的视图
部署2安装了App2和App3,因此应该显示如下导航:

  • 链接到App2的视图
  • 链接到App3的视图

如果没有在基本模板中定义导航并为每个部署编辑它,我就看不到这样做的方法。即使使用
{block.super}
,这似乎也不允许安装2个应用程序,因为每个子模板都会附加到父模板。

您可以简单地导入settings.py文件,并在已安装的应用程序列表上迭代

from django.conf import settings
for installed_app in settings.INSTALLED_APPS:

但我也怀疑这是否是一个明智的决定来实现您的应用程序。

这完全是我的想法,因此这可能不是“最佳”或最合适的方式

首先,如果你要依赖安装的应用程序,你应该按照以下原则实施:

MY_INSTALLED_APPS = (
   'app1',
   'app2',
)

INSTALLED_APPS = (
   # other installed apps
) + MY_INSTALLED_APPS
然后,您不必确定
INSTALLED_APPS
中的哪些项目是您的,哪些是第三方的,而只需使用
MY_INSTALLED_APPS
来构建菜单之类的功能

其次,在Django中,应用程序与视图之间没有任何有意义的联系。没有“默认”视图的概念,也不能简单地链接到应用程序。但是,您可以通过使用名称空间和视图命名约定来实现这一想法,具体来说,您的所有应用程序至少都有一个名为“index”的urlpattern

然后,在URL.py中创建URL模式,如:

url(r'^app1/', include('app1.urls', namespace='app1', app_name='app1'),
url(r'^app2/', include('app2.urls', namespace='app2', app_name='app2'),
# etc
在每个应用程序中,您创建一个URL.py,该URL.py至少有一个URL模式:

url(r'^$', some_view, name='index'),
这意味着在浏览器中转到
/app1/
将加载
一些视图
,您可以在代码中引用此视图,名称如下:
app1:index

棘手的部分是在模板中使用它。Django 1.5将添加在
{%url]
标记中为视图名称使用上下文变量的功能。从Django 1.3开始,您也可以通过
{%load url from future%}
使用此行为。然而,即使这样,也只能部分实现您所需的功能

在模板中,您需要循环使用
MY_INSTALLED_APPS
的值并构建链接。以下内容应通过
{%load url from future%}
或Django 1.5在Django 1.3-1.4中运行:

{% for app in apps %}
    <a href="{% url app|add:":index" %}">{{ app }}</a>
{% endfor %}
并且,在模板中:

{% for app in apps %}
    <a href="{{ app|default_url_for_app }}">{{ app }}</a>
{% endfor %}
{%用于应用程序中的应用程序%}
{%endfor%}

您真正想要的是某种应用程序注册系统。也就是说,对于加载的每个应用程序(即包含在已安装的应用程序中),使用链接列表注册其主页


我不会自动执行所有这些操作,而是以管理应用程序为例,让每个应用程序在第一次加载时调用一个注册函数。例如,您可以在models.py中执行此操作,因为您知道它将在启动时由Django导入。注册函数将获取应用程序名称和url,并构建一个字典ch然后可以通过上下文处理器传递给每个模板。

每个应用程序只有一个视图吗?或者每个应用程序都有主页吗?没有视图的应用程序呢?例如数据库迁移(South)、管理员皮肤、css/js压缩器等。@j_syk我只希望我的应用程序有这个视图(而不是管理员、South等)每个应用程序都会有一个主页,这是我唯一想要的链接。仍然需要为每个应用程序提供一个包含URL的字典,可能还需要一个使用哪些应用程序的白名单。我也在考虑这些问题,但这只会给你应用程序的路径,不确定如何从中获取URL。谢谢。这是def这是一个非常好的主意,我从中吸取了一些好的建议(为此我接受你的答案),但我决定使用来自的答案并创建“小部件”。每个应用程序的一个小部件是一段HTML,用于向应用程序的URLconf定义添加导航链接。
{% for app in apps %}
    <a href="{{ app|default_url_for_app }}">{{ app }}</a>
{% endfor %}