1.经常使用的模板标签
-做用是什么?提供各类逻辑
-模板标签格式 大括号 百分号 语句 百分号 大括号,还要有结尾也是大括号 百分号 end语句 百分号 大括号
好比 {% for item in items %}
item.元素1
item.元素2
item.元素3
.......
{% endfor %}
其中items能够是视图函数传过来的参数里的模板变量,模板标签里能够经过循环取得它里边的元素,依次把这些元素进行渲染,去执行模板标签和模板结尾标签之间定义的操做,循环直到取完items里边的元素为止css
{% for stu in students %} <tr {% if stu.sex == "女" %} style="color: red"{% endif %}> <td><a href="{% url 'teacher:detail' stu.id %}">{{forloop.counter}}</a></td> <td>{{stu.name}}</td> <td>{{stu.age}}</td> <td>{{stu.sex}}</td> </tr> {% endfor %}
-经常使用标签 for、 if、
(1)其中if语句的关系运算符==,<,>,<=,>= 运算符先后必须有空格,能够
{% if a== 'aaa' %} 此状况下执行某某语句
{% elif a>'aaa' %} 此状况下执行某某语句
{% else %}
{% endif %}
(2)url标签是单标签不用有endurl {% url 空格'app:视图函数'空格 须要传的参数1 空格 参数2 %},url模板标签也能够动态解析url,
注意:'app:视图函数'先后不要加'/',须要提早在urls.py中为app命名,以及给相应视图函数的path起名name='某某某名字'
(3)with {% with s2 = students.2%}
{% endwith %}
(4)循环的模板标签里想取得序号,可使用{{forloop.counter}},forloop能够获取当前for循环的迭代次数,.counter是下标以1开始,.counter0是下标从0开始
想让循环迭代次数从大到小排是.revcounter,以1结束,.revcounter0是以0结束
总结:本质仍是字符串格式化,语法 :
{% tag %} {% endtag %}
{% tag 参数 参数 %}
注意在模板标签的{}里用到的模板变量不用再加双层花括号了,变量名就能用,在模板标签和模板结尾标签之间的语句里模板变量要用双层花括号
2.模板的继承与引用 (include 和extends也是模板标签)
-引用 include标签 {% include 路径 %}能够把别的模板渲染完后的内容放到其余模板里你想放的位置,include标签是单独的标签,没有结尾标签,能够用于插入广告模板页面等,他的参数就是其余想引用的模板页面的路径
-继承 extends标签 解决前端代码冗余
(1)步骤:1)新建base模板,把全部模板最基本的共同内容写到base里,把其余模板须要更改的部分都去掉
2)在须要继承base模板的咱们定义的模板,最上面写extends标签{% extends 'app名/base.html' %},extends标签必须在模板文本最上面,注意标签里百分号后,extends后,路径后 都要有空格
继承的父模板外用引号括起来
3) 某个模板文本最上写上extends标签后,就表明它继承base父模板,它本身自己的内容就都不起做用了,只会显示继承自父模板的内容,去返回父模板所渲染的东西html
<title>{% block title %}base模板{% endblock %}</title> {% block link %} 这里引入你本身想用的css文件吧... {% endblock %} {% block c1 %} <p>abcdefgh....</p> {% endblock %}
上面这些是父模板中的代码前端
{% extends 'teacher/base.html' %} {% block link %} {% load static %} <link href="{% static 'teacher/css/login_1.css'%}" rel="stylesheet"> {% endblock %} {% block title %}loginteacher{% endblock %} {% block c1 %} <div class="container"> <form class="form-signin"> <h2 class="form-signin-heading">Please sign in</h2> <label for="inputEmail" class="sr-only">Email address</label> <input type="email" id="inputEmail" class="form-control" placeholder="Email address" required autofocus> <label for="inputPassword" class="sr-only">Password</label> <input type="password" id="inputPassword" class="form-control" placeholder="Password" required> <div class="checkbox"> <label> <input type="checkbox" value="remember-me"> Remember me </label> </div> <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button> </form> </div> <!-- /container --> {% endblock %}
这是自定义的模板中的代码python
(2) block标签 :base模板比如字符串中占位符,预留出来给继承它的模板显示本身的内容
注意,block标签是写父模板文本base.html中的时候,是留坑留给继承它的模板页面的,
block标签写在自定义的有个性内容的模板文本中的时候,能够填坑去定义本模板自定义的个性内容
本质仍是字符串格式化,占位坑想挖几个挖几个,想挖哪里挖哪里
语法 1)父模板中,想留空的位置{% block 随便起个名字 %} 。。。。{% endblok %} block标签也是闭合标签,要有结束标签,起的名字不要加引号扩起来
父模板中能够插入多个不一样命名的block标签和它本身的结尾block标签
block标签还能写到html页面标签当中,好比<title>{% block title %}base模板{% endblock %}</title>
2)继承父模板的自定义模板中,想自定义东西的位置写成对的block标签和结尾block标签名字要和副模版中对应的block标签名字相同,好比头部block标签里定义css样式,body里定义自定义显示的内容
{% block 和父模板中对应的block标签同样的名字 %}
任何自定义内容
{% endblock %}
若是副模版的block标签写在html标签中,自定义模板文本对应名字的block标签直接写html标签里的内容就能够了,外面的html标签都继承过来了
多个自定义模板能够继承同一个父模板,能够像python里的类同样屡次继承,咱们能够继承一个父模板,它继承了别的父模板
3)技巧:父模板和自定义模板尽量多挖坑,
常见的挖的坑都有:(1)定义一个页面底部的block标签{% block domready %}{% endblock %}用来留给自定义模板放js代码的地方
(2)页面上部定义的放css的坑
(3)页面上部定义的放script代码的坑
app