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

时间:2014-08-27 15:56:22

标签: python django

我正在考虑创建一个基于django的网站,它将有几个截然不同的部分。我的想法是这些应该是单独的应用程序,但我希望这些可以被带到不同的项目。

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

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

我想我要问的是:

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

2 个答案:

答案 0 :(得分:2)

持久菜单系统

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

{% block content %}{% endblock content %}

接下来在您的应用中创建一个名为app_base.html的模板,然后简单地添加一行:

{% extends "myproject/base.html" %}
{% block content %}{% endblock content %}

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

myproject/
    myproject/
    app_one/
        templates/
            app_one/
                app_base.html
    templates/
        myproject/
            base.html

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

{% extends "app_one/app_base.html" %}

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

可移植性

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

注意:当您将templates目录添加到项目根目录时,请不要忘记添加该行:

TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')]

到settings.py,以便Django知道在哪里可以找到其他模板。

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

答案 1 :(得分:-2)

Django Doc建议的最佳实践是使用基础骨架并在每个应用程序或页面中继承它,并且你可以使它成为可扩展的"被重写的块。

来自django doc: https://docs.djangoproject.com/en/dev/topics/templates/#template-inheritance

  

Django中最强大的 - 也是最复杂的 - 部分   模板引擎是模板继承。模板继承允许   你要构建一个包含所有常见的基础“骨架”模板   您网站的元素,并定义子模板可以使用的块   覆盖。