Django笔记&教程 3-3 模板常用语法

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的类,其第一个方法是可以在该结构中调用的
调用方法如下,其中aA的一个实例

{{ 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及用法将在后续相关章节中介绍

模板继承: blockendblockextends
模板加载静态文件(css或图片): load static

3 常用Filters

TODO: Filters感觉新手基本用不到(或者不习惯去用),未来本小部分可能会放在一个拓展小节中去讲。

posted @ 2021-01-16 12:57  大爽歌python编程辅导  阅读(156)  评论(0编辑  收藏  举报