zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    块拷贝
    Response.AddHeader函数中文件名的中文乱码问题的解决
    c#:如何往List>里添加 Dictionary<string,string>
    java的map中的containsKey 方法——判断是否包含指定的键名
    C# Hashtable 中的ContainsKey()方法
    C#的List的Contains方法 list的Contains方法是根据其元素类型定义的Equals方法来判断是否重复的
    C#从List Dictionary string, string 中查找指定的key,并修改对应的值
    C# 泛型Dictionary<string,string>的用法 ,ContarnsKey() 来判断键是否存存在
    C#去除list中的重复数据 倒叙遍历
    对象引用类型问题
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9599789.html
Copyright © 2011-2022 走看看