如何在多个Django应用中保持一个菜单?

6 投票
2 回答
3402 浏览
提问于 2025-04-18 18:44

我正在考虑创建一个基于Django的网站,这个网站会有几种截然不同的部分。我想把这些部分做成独立的应用,但我希望它们能够在不同的项目中使用。

我打算从数据库中创建一个主菜单系统。我希望网站的所有不同部分都能在这个主菜单下,并且都有一个统一的头部。

网上大多数例子都建议你创建一个base.html模板,里面放菜单,然后其他所有内容都从这个模板继承。但我觉得这样做在应用的可移植性上似乎不太好。我必须让所有模板都继承自base.html,这样会不会降低它们的可移植性呢?

我想问的是:

在Django中,如何在多个独立的应用之间创建一个持久的主菜单系统?

2 个回答

-1

根据Django文档的建议,最好的做法是使用一个基础模板,然后在你的每个应用或页面中继承这个模板。你可以通过重写一些部分来让它变得“可扩展”。

来自Django文档的内容:https://docs.djangoproject.com/en/dev/topics/templates/#template-inheritance

Django的模板引擎中最强大、也是最复杂的部分就是模板继承。模板继承让你可以创建一个基础的“骨架”模板,这个模板包含了你网站的所有公共元素,并定义了一些可以被子模板重写的部分。

5

持久菜单系统

我觉得传统的做法是,正如你所说的,先为你的项目创建一个基础模板。如果你想让它在多个应用中都能用,最简单的方法可能是把它放在项目根目录下的模板文件夹里,比如说: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 文件夹时,别忘了在 settings.py 中添加这一行:

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

这样 Django 才知道去哪里找额外的模板。

希望这些对你有帮助。这是我能想到的最佳解决方案,但我觉得在 Django 中实现模板继承的 100% 自主性可能会有点困难,因为子模板和父模板需要保持一致的区域。

撰写回答