django模板常用语法

301 阅读3分钟

模板常用语法:

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

1、基础语法

1.1 Django模板中只需要记两种特殊符号:

1.1 {{ }}和 {% %}

1.2 {{ }}表示变量,在模板渲染的时候替换成值,{% %}表示逻辑相关的操作。

1.2 点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值

数字:{{ num }}
<br>
字符串:{{ string }}
<br>
字典:{{ name_dict }} --> {{ name_dict.keys }} --> {{ name_dict.values }} --> {{ name_dict.name }}
<br>
列表:{{ name_list }} --> {{ name_list.2 }}
<br>
集合:{{ set }} --> {{ set.1 }}
<br>
元组:{{ tup }}  --> {{ tup.0 }}
<br>
类:{{ person }} --> {{ person.name }} --> {{ person.talk }}
.
.索引   .key   .属性   .方法(方法后面不加括号)
优先级:
.key > .属性   .方法 > .索引

2、过滤器

最多只有一个参数

2.1 过滤器:Filters

 return render(request,"template_text.html",{"new_num":""})
 
{{变量|过滤器:"参数"}}
default:
变量不存在或者为空时使用默认值 ,如果value值没传的话就显示nothing
{{ new_num|default:"2" }}

2.2 filesizeformat

# 将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)
​
return render(request, "template_text.html", {"value": 1024 * 1024 * 1024})
​
{{ value|filesizeformat }}  # filesizefomrat:1.0 GB

2.3 add +

给变量加参数
数字的加法,字符串和列表的拼接
add:{{ value2|add:"2" }} --> 列表相加:{{ name_list|add:name_list }}  #add:4 --> 列表相加:['张三', '李四', '王五', '张三', '李四', '王五']

2.4 lower,upper,title

小写:{{value|lower}}
大写:{{value|upper}}
标题:{{value|title}} #首字母大写
​
可以写在一起:{{value|upper|lower|title}}

2.5 length

{{ value|length }}
​
返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.

2.6 slice 切片

{{ name_list|slice:"0:2" }} #和python一样就是没有[][0:2]

2.7 first,last

{{value:first}}  #取第一个元素  和 {{value.0}}一样
{{value:last}}   #取最后一个元素

2.8 join 字符串拼接

使用字符串拼接列表。同python的str.join(list)。
​
{{ value|join:" __ " }}  #张三__李四__王五

2.9 truncatechars 字符串截取

如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
参数:截断的字符数
{{ long_str|truncatechars:9 }} #包括3个省略号  Django...
truncatewords :根据单词截断

2.10 date 日期格式化

import datetime
    now = datetime.datetime.now()
   
{{ now|date:"Y-m-d H:i:s" }}2020-08-08 10:17:14 
​
或者直接在settings.py里面定义格式
    1. USE_L10N = False
    2. 设置格式:
        DATETIME_FORMAT = 'Y-m-d H:i:s'
        TIME_FORMAT = 'H:i:s'
        DATE_FORMAT = ‘Y-m-d
        
    然后直接:{{ now }},就和上面一样的

2.11 safe

Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全
比如:
 "safe_text":"<a href='https://www.baidu.com'>点我</a>",
{{ safe_text}} 
我们就会在页面上获得字符串:<a href='https://www.baidu.com'>点我</a>
​
有时候我们不想这样,我们就可以加个safe
{{safe_text|safe}}  # 点我

3、自定义过滤器

3.1 在app下创建一个名为templatetags的python包(包的名字不能错,必须叫templatetags)

3.2 创建一个python文件,文件名自定义(mytags.py)

3.3 在python包中写:

```
from django import template
​
register = template.Library()  # register的名字不能错
```

4.  写函数+加装饰器

```
@register.filter
def add_arg(value, arg): #只能写二个参数,一个是变量,一个是过滤器的参数
    # 功能
    return "{}__{}".format(value, arg)
```

5.  使用

在模板中:

```
{% load mytags %}  #先用load加载 mytags这个文件
{{ person.name|add_arg:"我爱你" }} 
```

4、标签tags

4.1 for

<ul>
    {% for name in name_list %}
        <li>{{ forloop.counter }}-{{ name }}</li>
    {% endfor %}
</ul>

for循环可用的一些参数:

VariableDescription
forloop.counter当前循环的索引值(从1开始)
forloop.counter0当前循环的索引值(从0开始)
forloop.revcounter当前循环的倒序索引值(到1结束)
forloop.revcounter0当前循环的倒序索引值(到0结束)
forloop.first当前循环是不是第一次循环(布尔值)
forloop.last当前循环是不是最后一次循环(布尔值)
forloop.parentloop本层循环的外层循环
for ...empty
{% for name in name_list2 %}
    <li>{{ name }}</li>
{% empty %}
    为空了   #如果循环的对象为空的话,就输出它
{% endfor %}

4.2 if

{% if value2 > 2 %}
    可以
{% elif  value2 == 2 %}
    不错
{% endif %}

if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

注意:

  1. 条件中不支持算术运算

  2. 不支持连续判断

    {% if 5 > 4 > 1 %}  这样会报错  只有改成{% if 5 > 4 and 4 > 1 %}
        ok
    {% else %}
        no
    {% endif %}
    

4.3 with

就是重命名

{% with name_list as name%}
    {{ name }}
    {{ name }}
{% endwith %}
​
或者
{% with name = name_list %}
    {{ name }}
    {{ name }}
{% endwith %}