ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
默认配置下,Django 的模板系统会自动找到app下面的templates文件夹中的模板文件。 `Django 模板查找机制`: Django 查找模板的过程是在每个 app 的 templates 文件夹中找(而不只是当前 app 中的代码只在当前的 app 的 templates 文件夹中找)。各个 app 的 templates 形成一个文件夹列表,Django 遍历这个列表,一个个文件夹进行查找,当在某一个文件夹找到的时候就停止,所有的都遍历完了还找不到指定的模板的时候就是 `Template Not Found` (过程类似于Python找包)。这样设计有利当然也有弊,有利是的地方是一个app可以用另一个app的模板文件,弊是有可能会找错了。所以我们使用的时候在 templates 中建立一个 app 同名的文件夹,这样就好了。 如下图: ``` ├── db.sqlite3 ├── demo │   ├── __init__.py │   ├── settings.py │   ├── urls.py │   └── wsgi.py ├── learn │   ├── admin.py │   ├── __init__.py │   ├── models.py │ ├── views.py │   └── tests.py ├── templates │   └── learn │   ├── base.html │   ├── bottom.html │   ├── home.html │   └── nav.html  └── manage.py ``` ## 模板的结构 网站模板的设计,一般的,我们做网站有一些通用的部分,比如 导航,底部,访问统计代码等等 ``` ├── templates │   └── learn │   ├── base.html │   ├── bottom.html │   ├── home.html │   └── nav.html ``` ### 继承母版 extends 每个页面只能继承一个母版,且必须位于页面最上方。 >[danger] 何时引入JS和CSS? 可以在母版合适的位置使用相应的block进行,CSS可以在头文件中引入,JS可以在body标签的上一行引入。 ~~~ {% extends 'learn/base.html' %} ~~~ ### 引入模块include 用于引入一些小模块或者组件 ### 渲染时模块替换 block * `导航栏` nav.html ``` <div>导航栏</div> ``` * `页面底部` bottom.html ``` <div>页面底部</div> ``` * `基础模板` base.html ``` <!DOCTYPE html> <html> <head> <title>{% block title %}默认标题{% endblock %}</title> {% block css %} {% endblock %} </head> <body> {% include 'learn/nav.html' %} {% block content %} <div>这里是默认内容,所有继承自这个模板的,如果不覆盖就显示这里的默认内容。</div> {% endblock %} {% include 'learn/bottom.html' %} {% block js %} {% endblock %} </body> </html> ``` * `主页` home.html ``` {% extends 'learn/base.html' %} {% block css %} <link rel="stylesheet" href="/static/commons.css" /> {% endblock %} {% block title %} Home Page {% endblock %} {% block content %} <h2>This is home page.</h2> {% endblock %} {% block js %} <script src="/static/jquery.js"></script> {% endblock %} ```