Django 自学笔记兼学习教程第3章第3节——模板常用语法
点击查看教程总目录
本文主要参考:https://docs.djangoproject.com/en/2.2/ref/templates/builtins/
模板语法的四种结构中,Comments(注释)结构都是固定的,没有什么其他的变化和方法。
所以这里介绍下其他三种结构的各种用法。
1 Variables(变量)
该结构基础用法为
{{ variable}}
python为面向对象语言,所以程序里也会有各种对象,该结构中获取变量对象的某种属性的值和python的写法一样
{{ object.attritube }}
这里有一个需要特别介绍的,就是该结构中如何使用变量对象的某种方法:
该结构中只能使用变量对象无需传参的方法。
该结构中调用变量对象的方法时,不要在方法名后加括号()
举例如下
class A:
def valid_method(self):
return "It's a valild method"
def invalid_method(self, param):
return "It's an invalild method because it has a redundant param"
上面是一个名为A的类,其第一个方法是可以在该结构中调用的
调用方法如下,其中a
是A
的一个实例
{{ a.valid_method}}
该调用语句会再html中生成的对应文本为"It's a valild method"
第二个方法则是不可以在该结构中调用的,因为它包含一个参数param
,该语法结构中无法调入需要传参的方法。
类方法中self
是类对象本身,所以不算做参数。
拓展介绍
上面我们展示了点这个操作符: .
(dot operator)在模板中可以获取对象属性或者调用对象的方法。
不过具体的实际情况比这要复杂一些。
从技术上讲,当模板系统遇到一个点时,它会先后尝试用以下方式来理解.
这个点操作符并执行相应的查找:
- 字典的键查找
- 属性或者方法名查找
- (列表之类的)数字索引查找
比如这样的代码:
{{ a.b }}
具体执行时,会
- 先看a是不是字典类似的对象,有没有叫做b的键(key),有则返回对应的值(value)
- 然后看a这个对象有没有b这个属性(有则返回属性值),或者方法(有则调用方法,返回执行方法后的返回值)
- 最后看a是不是类似于列表的对象,有没有数字索引为b的,有则返回对应的元素值
同时由于有三种查找方式,有可能会导致冲突,第三种一般不会和其他两种冲突。
第一种和第二种有可能冲突,即字典键和字典对象本身具有的属性名或者方法名重名时,会导致后者无法获取到,所以要避免这种重名。
详细官方文档: ref/templates/language/#variables
2 常用Tags
url
: 调整url写法
返回与给定视图和可选参数匹配的绝对路径引用(不带域名的URL)。
<a href="/register/">register</a>
统一改为通过urls.py里面指定的urlpattern的name来访问
<a href="{% url 'register' %}">register</a>
好处:如果有url修改的话,只需要改一次urlpattern,不用去把所有有url的地方都修改一遍
更多信息:https://docs.djangoproject.com/en/2.2/ref/templates/builtins/#url
for
: 循环
循环遍历数组中的每个项,使该项在上下文变量中可用。
写法: (一定要用endfor结尾)
{% for obj in obj_list%}
...
{% endfor %}
示例
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
if
: 条件判断
{% if %}标签计算一个变量,如果该变量为“true”(即存在,不为空,不为false boolean值),则输出块的内容:
写法: (一定要用endif结尾)
{% if boolean_a %}
...
{% elif boolean_b % }
...
{% else %}
...
{% endif %}
示例
{% if athlete_list %}
Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
Athletes should be out of the locker room soon!
{% else %}
No athletes.
{% endif %}
其他常用Tags及用法将在后续相关章节中介绍
模板继承: block
、endblock
、extends
模板加载静态文件(css或图片): load static
3 常用Filters
TODO: Filters感觉新手基本用不到(或者不习惯去用),未来本小部分可能会放在一个拓展小节中去讲。