如何在多个 Django 应用程序中保留一个菜单?

Smi*_*lls 6 python django

我正在考虑创建一个基于 django 的网站,该网站将包含一些极其不同类型的部分。我的想法是,这些应该是单独的应用程序,但是我希望它们能够被带到不同的项目中。

我将拥有一个从数据库创建的主菜单系统。我希望网站的所有这些不同部分都位于此主菜单系统下,因此具有标准标题。

大多数在线示例似乎都说您应该使用菜单创建一个 base.html 模板,然后让其他所有内容继承该模板。我的问题是,就应用程序而言,这似乎不太便携。我必须让所有模板继承自base.html,我认为这会降低它们的可移植性?

我想我要问的是:

在 django 中跨多个独立应用程序创建持久主菜单系统的最佳方法是什么?

小智 5

持久菜单系统

我认为传统的方法是,正如您所说,为您的项目创建一个基本模板。如果您希望它可用于多个应用程序,最简单的方法可能是将其放在项目根目录中的模板文件夹中,即 myproject/templates/myproject/base.html。在此模板中,您构建菜单系统,然后包含一个要被子模板覆盖的块:

{% block content %}{% endblock content %}
Run Code Online (Sandbox Code Playgroud)

接下来在您的应用程序中创建一个名为类似的模板app_base.html,只需添加以下行:

{% extends "myproject/base.html" %}
{% block content %}{% endblock content %}
Run Code Online (Sandbox Code Playgroud)

此时您的目录结构应如下所示:

myproject/
    myproject/
    app_one/
        templates/
            app_one/
                app_base.html
    templates/
        myproject/
            base.html
Run Code Online (Sandbox Code Playgroud)

然后,在您为该应用程序创建的每个后续模板中,在顶部添加以下行:

{% extends "app_one/app_base.html" %}
Run Code Online (Sandbox Code Playgroud)

然后,您可以为您创建的每个应用程序重复此操作,这意味着您只需要base.html在想要调整菜单系统时进行编辑。

可移植性

您在每个应用程序中创建的事实app_base.html应该允许您取出任何一个应用程序并将其放入另一个项目中,而不必遍历每个模板并更改它继承的模板的名称。然后,您可以简单地进行编辑app_base.html,使页面布局与新项目的结构保持一致。例如,可以通过将新的布局代码直接写入此模板,或更改extends顶部的行以从新站点的基本模板继承(请注意,此基本模板必须包含一个content块)来完成此操作。 )。

注意:将templates目录添加到项目根目录时,不要忘记添加以下行:

TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')]
Run Code Online (Sandbox Code Playgroud)

到 settings.py 以便 Django 知道在哪里可以找到附加模板。

我希望这有帮助。这是我能想到的最好的解决方案,但我觉得在 Django 中通过模板继承实现 100% 的自治可能很困难,因为子模板和父模板需要保持彼此一致的块。