Django学习系列之模板

时间:2023-12-19 16:12:02

什么是django模板

模板是一个文本,用于分离文档的表现形式和内容,模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签)

模板通常用于产生HTML

如何使用模板

  1. 创建一个Template对象
  2. 传入一套变量context,调用render方法,它将返回一个基于模板的展现字符串,模板中的变量和标签会被context值替换
F:\Python\PyCharm\Project\cmdb>python manage.py shell
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.template import Context,Template
>>> t = Template('my name is {{ name }}')
>>> c = Context(['name':'zhai'])
>>> t.render(c)
'my name is zhai

PS:这就是使用django的的基本规则,写模板、创建Template对象,调用render()方法

模板标签

if/else标签

基本语法格式如下

{% if condition %}
... display
{% endif %}

或者

{% if condition1 %}
... display 1
{% elif condiiton2 %}
... display 2
{% else %}
... display 3
{% endif %}

根据条件判断是否输出,if/else支持潜逃

if标签接受and、or、not关键字来对多个变量做判断,或者对变量取反;例如:

{% if athlete_list and coach_list %}
athletes 和 coaches 变量都是可用的。
{% endif %}

for标签

跟python的for一样

{% for x in y%}
...
{% endfor %}

ifeqal/ifnoteqal标签

{% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值

下面的例子比较两个模板变量 user 和 currentuser 
{% ifequal user currentuser %}
<h1>Welcome!</h1>
{% endifequal %}

和 {% if %} 类似, {% ifequal %} 支持可选的 {% else%} 标签

{% ifequal section 'sitenews' %}
<h1>Site News</h1>
{% else %}
<h1>No News Here</h1>
{% endifequal %}

include标签

每当多个模板中出现相同的代码时,就可以考虑使用{% include %}标签来减少重复

下面例子包含了nav.html模板

{% include "nav.html" %}

Django模板继承

本质上来说,模板继承就是先构建一个基础的模板框架,而后再其子模板中对它所包含站点公用部分和定义块进行重载

定义基础模板base.html,该框架之后将由子模板current.html集成

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<h1>My helpful timestamp site</h1>
{% block content %}{% endblock %}
{% block footer %}
<hr>
<p>Thanks for visiting my site.</p>
{% endblock %}
</body>
</html>

note:{% block %}标签就是告诉模板引擎,该模板下的这一块内容将有可能被子模板覆盖

定义子模板current.html

{% extends "includes/base.html" %}
{% block title %}The current time{% endblock %}
{% block content %}
<p>It is now {{ current_date }}.</p>
{% endblock %}

note:

  1. 在加载current.html模板时,模板引擎发现了{% extends %}标签,表示这个模板是子模板,模板引擎立即加载父模板,即base.html
  2. 此时模板引擎注意到base.html中的三个{% block %}标签,子模板里有两个{% block %},所以子模板的block会替换父模板的block内容;剩下一个block子模板中没有定义,所以用父模板的内容