一、标签的使用(tag)
1、语法格式:{% tags %}
2、提供的几种标签
- {% if %}:计算一个变量值,如果是“true”,即它存在、不为空并且不是false的boolean值,系统则会显示{% if %}和{% endif %}间的所有内容
{% if ani.age > 25 %}
<h1>{{ ani.name }},you have a lot of responsibilities!</h1>
{% elif ani.age >= 18 %}
<h1>{{ ani.name }},you have been an adult!</h1>
{% else %}
<h1>You just a child!</h1>
{% endif %}
- {% for %}:允许你按顺序遍历一个序列中的各个元素,每次循环模板系统都会渲染{% for %}和{% endfor %}之间的所有内容
{#for循环#}
{#注意:for是没有办法拿到索引的,只能用forloop.counter来拿#}
{% for name in li %}
<h3>{{ forloop.counter }}:{{ name }}</h3>
<h4>{{ forloop.revcounter }}:{{ name }}</h4>
{% endfor %}
{% for name in li %}
{% if forloop.first %}
{# 创建一个列表标签,并且带有class为first的标签背景色变红#}
<li class="first">
{% else %}
<li>
{% endif %}
{{ name }}
</li>
{% empty %}
<h1>没有相关文章!</h1>
{% endfor %}
- {%csrf_token%}:用于生成csrf_token的标签,用于防治跨站攻击验证。
- {% url %}:引用路由配置的地址
{#{% url %}引用路由配置地址#}
<form action="{% url 'login' %}" method="post">
<p>账号:<input type="text"></p>
<p>密码:<input type="text"></p>
<p><input type="submit"></p>
{% csrf_token %}
{# 一种Django的安全机制,相当于给页面加上了一个身份证——一串编码,有了这个才可以正常跳转到url 'login'页面#}
</form>
- {% with %}:用更简单的变量名替代复杂的变量名
{% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}
- {% verbatim %}:禁止render
{% verbatim %}
{{ hello }}
{% endverbatim %}
- {% load %}: 加载标签库
二、自定义filter和simple_tag
1、自定义filter过滤器
- a、首先在app中创建templatetags模块
- b、然后创建任意 .py 文件,如:myTag.py
- c、套用引用代码:
from django import template
from django.utils.safestring import mark_safe
register = template.Library() #register的名字是固定的,不可改变
- d、编写自定义的函数
- e、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py :{% load my_tags %}
- f、在html中调用:由于filter函数只接收两个参数,因此此处只能传入一个参数,可以是列表、字典
<h1>filter:{{ ani.age|filter_muti:3 }}</h1>
2、自定义simple_tag:
可以传任意个参数,用空格隔开
simple_tag_muti函数已经在上图展示了,这里直接调用
<h1>simple_tae:{% simple_tag_muti 26 2 10%}</h1>
3、注意:
- a、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag
- b、filter可以用在if等控制语句后,simple_tag不可以
{% if num|filter_multi:30 > 100 %}
{{ num|filter_multi:30 }}
{% endif %}
三、extend模板继承
1、include 模板标签
该标签允许在(模板中)包含其它的模板的内容。 标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串。 每当在多个模板中出现相同的代码时,就应该考虑是否要使用 {% include %} 来减少重复。
2、extend继承模板标签
在整个网站中,如何减少共用页面区域(比如站点导航)所引起的重复和冗余代码?
比如,如果有一个更典型的网站,它有导航条、样式表,可能还有一些 JavaScript 代码,事情必将以向每个模板填充各种冗余的 HTML 而效率低下。
传统解决方法是使用 服务器端的 includes ,你可以在 HTML 页面中使用该指令将一个网页嵌入到另一个中。 事实上, Django 通过刚才讲述的 {% include %} 支持了这种方法。
3、extend 的本质
模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载。
4、继承的步骤
(1) 创建 base.html 模板,在其中定义站点的主要外观感受。 这些都是不常修改甚至从不修改的部分。
(2) 为网站的每个区域创建 base_SECTION.html 模板(例如, base_photos.html 和 base_forum.html )。这些模板对base.html 进行拓展,幷包含区域特定的风格与设计。
(3)为每种类型的页面创建独立的模板,例如论坛页面或者图片库。 这些模板拓展相应的区域模板。
这个方法可最大限度地重用代码,并使得向公共区域(如区域级的导航)添加内容成为一件轻松的工作
5、继承后的修改
{#继承base.html#}
{% extends 'base.html' %}
{#修改样式:前提是base里面也必须有{% block style %}#}
{% block styles %}
<style>
h2{
background-color: yellowgreen;
}
</style>
{% endblock %}
{#但是有一部分需要修改,则只能改{{ block }}里的内容#}
{% block content %}
{# 获取父类#}
{{ block.super }}
{% for s in student_list %}
<h2>学生{{ s }}</h2>
{% endfor %}
{% endblock %}
6、extend继承注意
-
如果在模板中使用 {% extends %} ,必须保证其为模板中的第一个模板标记。 否则,模板继承将不起作用。
-
一般来说,基础模板中的 {% block %} 标签越多越好。 记住,子模板不必定义父模板中所有的代码块,因此你可以用合理的缺省值对一些代码块进行填充,然后只对子模板所需的代码块进行(重)定义。
-
如果发觉自己在多个模板之间拷贝代码,你应该考虑将该代码段放置到父模板的某个 {% block %} 中。
如果你需要访问父模板中的块的内容,使用 {{ block.super }}这个标签吧,这一个魔法变量将会表现出父模板中的内容。 如果只想在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了。 -
不允许在同一个模板中定义多个同名的 {% block %} 。 存在这样的限制是因为block 标签的工作方式是双向的。
也就是说,block 标签不仅挖了一个要填的坑,也定义了在父模板中这个坑所填充的内容。如果模板中出现了两个相同名称的 {% block %} 标签,父模板将无从得知要使用哪个块的内容。