gpt4 book ai didi

django - 根据 INSTALLED_APPS 添加导航链接

转载 作者:行者123 更新时间:2023-12-04 05:59:41 24 4
gpt4 key购买 nike

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

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

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

例如,部署 1 的 App1 和 App2 列在 INSTALLED_APPS 中,因此会有这样的导航:

  • 链接到 App1 的 View
  • 链接到 App2 的 View

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

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

    最佳答案

    这完全是我的想法,所以它可能不是“最好的”或最合适的方式。

    首先,如果您要依赖 INSTALLED_APPS你实际上应该按照以下方式实现一些东西:

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

    INSTALLED_APPS = (
    # other installed apps
    ) + MY_INSTALLED_APPS

    然后,不必弄清楚 INSTALLED_APPS 中的哪些项目是您的,哪些是第三方的,您只需使用 MY_INSTALLED_APPS而是用于构建菜单之类的事情。

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

    然后,在您的 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您可以在代码中引用此 View ,其名称如下: app1:index .

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

    在您的模板中,您需要遍历 MY_INSTALLED_APPS 的值。并构建链接。以下内容应通过 {% load url from future %} 在 Django 1.3-1.4 中工作或 Django 1.5:
    {% for app in apps %}
    <a href="{% url app|add:":index" %}">{{ app }}</a>
    {% endfor %}

    实现此目的的另一种方法是使用模板过滤器,这是 Django <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 %}

    关于django - 根据 INSTALLED_APPS 添加导航链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9080744/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com