我正在考虑创建一个基于django的网站,它将有几个截然不同的部分。我的想法是这些应该是单独的应用程序,但我希望这些可以被带到不同的项目。
我将有一个从数据库创建的主菜单系统。我希望网站的所有这些不同部分都在这个主菜单系统下,因此,有一个标准的标题。
大多数在线示例似乎都说您应该使用菜单创建一个base.html模板,然后让其他所有内容继承。我的问题是,就应用程序而言,这似乎并不具备可移植性。我必须让所有模板继承自base.html,我觉得这会降低它们的可移植性吗?
我想我要问的是:
在django中跨多个独立应用创建持久主菜单系统的最佳方法是什么?
答案 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中最强大的 - 也是最复杂的 - 部分 模板引擎是模板继承。模板继承允许 你要构建一个包含所有常见的基础“骨架”模板 您网站的元素,并定义子模板可以使用的块 覆盖。