Django模板语法

知识点:模板语法之变量的深度查询方法,基本过滤器的用法和自定义过滤器的方法,模板语法之标签的使用和自定义标签。

模板语法
filter
{{}}
1 变量
句点符,深度查询(可以点到方法,不要加括号,只能是无参的方法)

-----------------------此处插入变量模板语法------------------------

注意:不符合条件的过滤会返回空
2 过滤器

过滤器基本格式:{{变量名|过滤器名称:过滤条件}}===》变量名都可以写成变量值。

import datetime

now = datetime.datetime.now()  ===》变量是视图函数里定义的变量,视图函数调用模板并对模板进行渲染

视图函数的变量就是模板{{}}里的变量。

<p>date过滤器 {{ now|date:'Y-m-d:H:i:s' }}</p>
<p>date过滤器 {{ now|date }}</p>


如果一个变量是false或者为空,使用给定的默认值。如果不为空,使用变量原来的值。就相当于给为空的变量设置默认值。例如:

前面的变量名都可以写成变量值
<p>default过滤器 {{ ss2|default:'字符串没有值' }}</p>
<p>default过滤器 {{ ll3|default:'列表没有值' }}</p>


返回值的长度。它对字符串和列表都起作用
<p>length过滤器 {{ ll2|length }}</p>  # 不用加冒号


将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
<p>filesizeformat过滤器 {{ file|filesizeformat }}</p>
<p>filesizeformat过滤器 {{ 1024|filesizeformat }}</p>  ===》1kb


切片操作

如果变量长度小于切片,只获取变量最大长度的值。
<p>slice过滤器 {{ 'lqzisbig'|slice:'1:9' }}</p> 


如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾
<p>truncatechars过滤器 {{ 'lqzisbigdddddddeee'|truncatechars:9 }}</p>  # 先减去三个点的长度
<p>truncatewords过滤器: {{ 'lqz is big and egon is small'|truncatewords:3 }}</p>


<p>safe过滤器: {{ ss3|safe }}</p> ==》如果不用safe过滤,存到数据库的数据取出来渲染模板,返回给浏览器还是显示的标签内容。
xss攻击:跨站脚本攻击   
{#可以在视图函数里处理#}
from django.utils.safestring import mark_safe
ss3=mark_safe(ss3)
<p>safe过滤器: {{ ss3|safe }}</p>


俩参数可以传字符串和数字,具体详见源码
<p>add过滤器: {{ 12|add:"3" }}</p>
<p>add过滤器: {{ 'eee'|add:"3rrr" }}</p>

tag:模板标签的用法
{% %}

for、if、with都要有对应的结束标签
for :forloop ===》小难点

问题:forloop.first和forloop.last的值以及用途

解析:first和last这两个属性很重要 可以用来获取循环开始的信息和循环结束的信息。
{%for i in ll%}
#forloop必须在for循环里使用

注释:parentloop是由多层循环里面层次的循环才能看到字典里有值。外面打印parentloop只能看到空字典。
{{forloop}} ===》{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 3, 'revcounter0': 2, 'first': True, 'last': False}


#{%empty%}是比如循环的是空列表或者空字符串或直接跳到empty,输出empty内容

{% empty%}
{% endfor%}
if if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
{%if 条件%}
{% endif%}

补充了一个循环字典:

{%for i,v in dic.items%}  这儿着重注意:for虽然是一个标签函数,但是后面的参数i,v还是不能分开,用来变量解压的i,v需要用逗号分开。

第一种写法:
{% with aa=dic.name%}
{{aa}}
{%endwith%}

第二种写法:

{% with dic.name as aa%}

{{aa}}

{%endwith%}


自定义过滤器
1 先去setting里面把app名字配置上
2 在app目录下创建一个templatetags模块===》templatetags文件夹
3 写py文件(my_test.py)===》templatetags下建py文件
4 from django import template ===》导入template模块
5 register=template.Library()  ===》固定格式
6 写函数 addstr(用register.filter()装饰)
7 模板里导入文件夹my_test:
8 {% load my_test %}
9 {{'lqz'|addstr:'isbig' }} #最多只能传两个参数


自定义标签:
1 先去setting里面把app名字配置上
2 再app目录下创建一个templatetags模块
3 写py文件(my_test.py)
4 from django import template
5 register=template.Library()
6 写函数 my_sum@register.simple_tag(name='yy')装饰)
@register.simple_tag(name='yy')
def my_sum(x,y,z,i):

return x+y+z+i
7 模板:
8 {% load my_test %}
9 {% yy 12 34 56 78 %} #以空格做分割,传参数

下面附上今天作业的两个函数

作业:
1 上课讲的整理完
2 自定义一个标签(输入一个值,计算出阶乘,显示在页面)
3 自定义一个过滤器 (输入两个参数,做累加,支持数字,字符串(如果一个数字,一个字符串,强行相加))

作业注意点:冒号后的数字是Safetext类型,不能用str转换。

参数:自定义过滤器只能接受两个参数,第一个是变量名,第二个是冒号后面的参数。

 1 from django import template
 2 # 必须用reqgister这个名字,一点都不能错
 3 # register是Library的对象
 4 register = template.Library()
 5 # 自定义过滤器
 6 # filter是Library里的方法,用register对象调用
 7 @register.filter(name='tt')
 8 def addrstr(x,y):  # 只能有两个值
 9     # if type(x) is str and type(y) is str:
10     #     return str(x) + str(y)
11     if type(x) is str:
12        return str(x) +y
13     elif type(x) is not str:
14         return str(x) + y
15     return x+y
16 
17 # 自定义标签
18 @register.simple_tag(name='yy')
19 def my_sum(x):
20     m = 1
21     for i in range(x):
22         m = m*(i+1)
23     return m

笔记附录:

views视图函数:

 1 from django.shortcuts import render
 2 from django.utils.safestring import mark_safe
 3 # Create your views here.
 4 class Person:
 5     def __init__(self,name):
 6         self.name=name
 7     @classmethod
 8     def class_test(cls):
 9         print('class method')
10         return 'class method'
11     def test(self):
12         print('method')
13         return self.name
14     # def __str__(self):
15     #     return self.name
16 
17 def index(request):
18     ss='lqz is big'
19     i=20
20     ll=['lqz',18,[1,2,[2,3]]]
21     ll4=[[1,2,3],[2,3,4],[1,2,9]]
22     dic={'name':'lqz','age':18,'t':[1,2,[2,3]]}
23     b=True
24     lqz=Person('lqz')
25     egon=Person('egon')
26     xiaohou=Person('xiaohou')
27     monkey=Person('monkey')
28     ll2=[lqz,egon,xiaohou,monkey]
29     dic2={'lqz':lqz,'egon':egon}
30     # print(lqz.class_test())
31     # print(dic['name'].upper)
32     ll3=[]
33     ss2=''
34     ss3='<a href="https://www.baidu.com">点我</a>'
35     ss3=mark_safe(ss3)  
36     import datetime
37     now=datetime.datetime.now()
38     file=1024*1024*1024
39 
40     # locals()要加括号 表示所有index函数下变量都可以放到模板里面
41     # 缺点:函数外部引入的变量也可以放在里面,可能会造成变量重复。
42     return render(request,'index.html',locals())
43     # return render(request,'index.html',{'ss':ss,})
views
  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>Title</title>
  6 {#    <link rel="stylesheet" href="/static123/mycss.css">#}
  7     {% load static %}
  8     <link rel="stylesheet" href="{% static 'mycss.css'%}">
  9 
 10 
 11 </head>
 12 <body>
 13 <hr>
 14 <p>add:{{ '123'|add:'134' }}</p>
 15 <p>add:{{ 123|add:134 }}</p>
 16 <p>add:{{ 'err'|add:134 }}</p>
 17 <p>add:{{ 'err'|add:'ttyy' }}</p>
 18 <p>safe过滤器:  {{ ss3|safe }}</p>
 19 <p>截断:{{ 'ddf ddh jjjjej'|truncatechars:8 }}</p>
 20 <p>截断:{{ 'ddf ddh jjjjej'|truncatewords:2}}</p>
 21 <p>切片:{{ 'lqz is dsb'|slice:'1:12' }}</p>
 22 <p>文件:{{ file|filesizeformat }}</p>
 23 <p>文件:{{ 1024|filesizeformat }}</p>
 24 <p>不为空:{{ 'lqz 111'|default:'egon is dsb' }}</p>
 25 <p>字符串:{{ ss }}</p>
 26 <p>数字:{{ i }}</p>
 27 <p>列表:{{ ll }}</p>
 28 句点符,做深度查询
 29 <p>列表第2个值:{{ ll.2.2.0}}</p>
 30 <p>布尔类型:{{ b}}</p>
 31 <p>字典:{{ dic }}</p>
 32 <p>字典取值:{{ dic.age }}</p>
 33 <p>字典取值:{{ dic.t.2.1 }}</p>
 34 <p>对象:{{ lqz }}</p>
 35 <p>对象取值:{{ lqz.name }}</p>
 36 执行方法,不要加括号,
 37 <p>对象方法:{{ lqz.test }}</p>
 38 <p>类方法:{{ lqz.class_test }}</p>
 39 注释:前端看不到,django给处理了
 40 {#<p>类方法:{{ Person}}</p>#}
 41 <p>列表对象{{ ll2 }}</p>
 42 <p>列表对象取值{{ ll2.1 }}</p>
 43 <p>列表对象取值,在取值{{ ll2.1.name }}</p>
 44 <p>对象字典{{ dic2 }}</p>
 45 <p>对象字典取值{{ dic2.egon.name }}</p>
 46 <p>空列表的情况{{ ll3 }}</p>
 47 直接替换成空
 48 <p>空字符串的情况{{ ss2 }}</p>
 49 
 50 <p>a标签 {{ ss3 }}</p>
 51 <h4>字典:{{ ss.upper }}</h4>
 52 <h4>字典:{{ dic.name.upper }}</h4>
 53 &lt
 54 
 55 {#<script>alert('dsb')</script>#}
 56 冒号后不能加空格 now是第一个参数,冒号后面是第二个参数
 57 <p>date过滤器 {{ now|date:'Y-m-d:H:i:s' }}</p>
 58 <p>date过滤器 {{ now|date }}</p>
 59 如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:
 60 <p>default过滤器  {{ ss2|default:'字符串没有值' }}</p>
 61 <p>default过滤器  {{ ll3|default:'列表没有值' }}</p>
 62 返回值的长度。它对字符串和列表都起作用
 63 <p>length过滤器  {{ ll2|length }}</p>
 64 将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
 65 <p>filesizeformat过滤器  {{ file|filesizeformat }}</p>
 66 <p>filesizeformat过滤器  {{ 1024|filesizeformat }}</p>
 67 切片操作
 68 <p>slice过滤器  {{ 'lqzisbig'|slice:'1:9' }}</p>
 69 如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾
 70 <p>truncatechars过滤器  {{ 'lqzisbigdddddddeee'|truncatechars:9 }}</p>
 71 <p>truncatewords过滤器:  {{ 'lqz is big and egon is small'|truncatewords:3 }}</p>
 72 <p>safe过滤器:  {{ ss3|safe }}</p>
 73 {#可以在视图函数里处理#}
 74 <p>safe过滤器:  {{ ss3|safe }}</p>
 75 俩参数可以传字符串和数字,具体详见源码
 76 <p>add过滤器:  {{ 12|add:"3" }}</p>
 77 <p>add过滤器:  {{ 'eee'|add:"3rrr" }}</p>
 78 
 79 <hr>
 80 <h1>模板语法之标签</h1>
 81 
 82 {% for foo in ll %}
 83     <p>{{ forloop }}</p>
 84     <p>{{ forloop.counter }}</p>
 85     <p>{{ forloop.counter0 }}</p>
 86     <p>{{ forloop.revcounter }}</p>
 87     <p>{{ forloop.revcounter0 }}</p>
 88     <p>{{ forloop.first }}</p>
 89     <p>{{ forloop.last }}</p>
 90     {% if forloop.first %}
 91         lqz is big
 92         {% elif forloop.last %}
 93         俩人都小
 94         {% else %}
 95         egon is small
 96 
 97     {% endif %}
 98 
 99     <p>{{ foo }}</p>
100 
101 {% endfor %}
102 {% for foo in ll %}
103     <p>{{ foo }}</p>
104     {% empty %}
105      没有值
106 {% endfor %}
107 
108 {% for foo in ll3 %}
109     <p>{{ foo }}</p>
110 
111     {% empty %}
112     一定要放在for循环中
113      没有值
114 {% endfor %}
115 <hr>
116 {% for foo in ll4 %}
117     {% for i in foo %}
118         <p>{{ forloop }}</p>
119        <p>{{ forloop.parentloop }}</p>
120 
121 
122     {% endfor %}
123 
124 {% endfor %}
125 
126 if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
127 
128 {% with ttttt=dic.name %}
129     相当于重新赋值
130     <p>{{ dic.name }}</p>
131     <p>{{ ttttt }}</p>
132     <p>{{ ttttt }}</p>
133     <p>{{ ttttt }}</p>
134 
135 
136 {% endwith %}
137 <hr>
138 <h1>自定义标签</h1>
139 {% load my_test %}
140 
141 {{ '123'|tt:'111' }}
142 
143 {% yy 5 %}
144 
145 {% if  'lqz'|tt:'isbig'%}
146     {%  yy 6 %}
147 
148 {% endif %}
149 自定义的过滤器,可以放在if判断里,
150 自定义的标签,不能放在if判断里条件里
151 {#{% if  yy 12 3 17 89 %}#}
152 {#    zifuc#}
153 {##}
154 {#{% endif %}#}
155 </body>
156 </html>
index.html
{% load static %}
<link rel="stylesheet" href="{% static 'mycss.css'%}"> 相当于反向解析,STATIC_URL改变,后面涉及到的也会随之改变。
这里的static是封装的一个函数。
这里的返回值是static/mycss.css/
<link rel='stylesheet' href='{%get_static_prefix%}mycss.css'>
这里的返回值是/static/

原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9599789.html