templates目录
前面了解过了在Django中HTML文件可以放在项目目录下的templates
目录下,这个目录名字翻译过来就是模板的意思,对这一情况不太明白。
实际上这个目录下理应放的正是一种HTML模板,对于网站而言,很多页面的结构有类似的成分,将这些共同的成分抽象出来就可以形成模板了。例如导航条、脚标栏等往往是一样的。
页面继承一个模板,也就具有了这个模板所具备的所有成分。而对于那些不一样的地方,比如页面的具体内容等,可以对模板上的内容进行添加和覆盖,这样就形成了风格统一的各个页面,而且还能避免重复代码,还能提高可维护性。
DjangoTemplates
是Django的默认模板引擎,可以在配置目录下的settings.py
中看到相关配置:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
也可以将其换成基于该默认模板的Jinja2模板,它们的语法很相似,暂时就不换了。前面说的Jinja2动态页面,其实是在用这个模板原型。
简易的使用模板的例子
建立一个base.html
作为模板:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}默认标题{% endblock %}-标题的共同部分</title>
</head>
<body>
{#引入导航条#}
{% include 'nav.html' %}
{#默认内容区域#}
{% block content %}
<div>
这里是默认内容
</div>
{% endblock %}
{#引入尾标#}
{% include 'bottom.html' %}
</body>
</html>
像导航条和尾标这样基本不会改变的内容,也即是模板直接引用的页面,应当和模板一样放在templates目录下。
修改index.html
来引用这个模板:
{% extends 'base.html' %}
{#在继承了模板之后,只需要覆盖要修改的block即可#}
{% block title %}
首页
{% endblock %}
{% block content %}
<div>
首页上的内容...
</div>
{% endblock %}
语义上而言,这样的页面不必和模板放在一起,为了测试方便这里还是放在一起。可以看到对这个页面的书写已经完全不遵循HTML应有的样子了,只需要用Jinja2语法覆盖掉要修改的模板中的block部分即可。
浏览器访问结果:
DjangoTemplates模板在页面上的基本语法
访问从render的第三个参数字典传来的value
{{ key }}
按下标循环遍历列表
{% for i in 指示value为列表的key %}
{{ i }}
{% empty %}
{#到这里说明列表为空#}
{% endfor %}
按key访问字典中的value
{{ 指示value为字典的key.要访问的value的key }}
条件分支
{% if 表达式1 %}
...
{% elif 表达式2 %}
...
...
{% elif 表达式n %}
...
{% else %}
...
{% endif %}
其中的表达式和python中的使用一样,可以使用not
、and
、or
等修饰。