添加基于INSTALLED_APPS的导航链接

时间:2012-01-31 13:58:16

标签: django django-templates

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

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

我想要实现的是一个链接导航列表,它只显示INSTALLED_APPS中应用的链接。

例如,部署1在INSTALLED_APPS中列出了App1和App2,因此会有如下导航:

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

部署2安装了App2和App3,因此应该显示如下导航:

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

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

3 个答案:

答案 0 :(得分:3)

这严格来自我的头脑,因此它可能不是“最佳”或最合适的方式。

首先,如果您要依赖INSTALLED_APPS,您应该实际执行以下内容:

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

INSTALLED_APPS = (
   # other installed apps
) + MY_INSTALLED_APPS

然后,您只需使用INSTALLED_APPS来代替构建菜单等内容,而无需弄清楚MY_INSTALLED_APPS中的哪些项目属于您自己,哪些是第三方。

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

然后,在你的urls.py中创建urlpatterns,如:

url(r'^app1/', include('app1.urls', namespace='app1', app_name='app1'),
url(r'^app2/', include('app2.urls', namespace='app2', app_name='app2'),
# etc

在每个应用中,您创建一个至少包含一个urlpattern的urls.py:

url(r'^$', some_view, name='index'),

这意味着您在浏览器中转到/app1/然后会加载some_view,您可以在代码中引用此视图,其名称如下:app1:index

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

在模板中,您需要循环遍历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 %}

实现此目的的另一种方法是使用模板过滤器,这是Django&lt; 1.3中唯一的选项,在以后的版本中可能仍然是首选。类似的东西:

@register.filter
def default_url_for_app(app):
    return reverse(app+':index')

并且,在您的模板中:

{% for app in apps %}
    <a href="{{ app|default_url_for_app }}">{{ app }}</a>
{% endfor %}

答案 1 :(得分:0)

您可以简单地导入settings.py文件并遍历INSTALLED_APPS列表。

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

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

答案 2 :(得分:0)

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

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