模板层

Posted xujinjin18

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板层相关的知识,希望对你有一定的参考价值。

 

filter
{{}}
    1 变量
        1 句点符,深度查询 
        2 可以点到方法,不要加括号,只能是无参的方法 
        3 xss跨站脚本攻击: 比如提交评论<script>alert(dsb)</script> 存到数据库 响应到html 浏览器解释 就会弹窗 如果for循环一千次或者多次 页面就崩了
         这就是xss攻击  所以一定要处理
        如果不要django处理(比如:<用&gt; 替换) 
        就要显示标签可以这样处理:
            1 ss3=mark_safe(ss3)        from django.utils.safestring import mark_safe                 在views中
            2 <p>safe过滤器:  {{ ss3|safe }}</p>                                                       html中
       3 @register.simple_tag(is_safe=False)  默认是true,防止xss攻击,显示字符串。false浏览器直接解释标签 自定义标签时设置false
2 过滤器 冒号后不能加空格 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> 将值格式化为一个 “人类可读的” 文件尺寸 单位是B (例如 13 KB, 4.1 MB, 102 bytes, 等等)。例如: <p>filesizeformat过滤器 {{ file|filesizeformat }}</p> <p>filesizeformat过滤器 {{ 1024|filesizeformat }}</p> 切片操作 <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 xss攻击:跨站脚本攻击 1 在html中处理 <p>safe过滤器: {{ ss3|safe }}</p> 2 {#也可以在视图函数里处理#} from django.utils.safestring import mark_safe ss3=mark_safe(ss3) 俩参数可以传字符串和数字,具体详见源码 <p>add过滤器: {{ 12|add:"3" }}</p> <p>add过滤器: {{ eee|add:"3rrr" }}</p> tag {% %} for :forloop {%for i in ll%} #必须再for循环里使用 {{forloop}} 字典 # {% empty%}} 判断是否为空 {% endfor%} if if语句支持 andor、==、>、<、!=、<=、>=、innot inisis not判断。 {%if 条件%} {% endif%} {% with aa=dic.name%} 起别名 {{aa}} {%endwith%} 自定义过滤器 1 先去setting里面把app名字配置上 2 再app目录下创建一个templatetags模块 3 写py文件(my_test.py) 4 from django import template 5 register=template.Library() 6 写函数 addstr(用register.filter()装饰) 7 模板: 8 {% load my_test %} 9 {{lqz|addstr:isbig }} #最多只能传两个参数 自定义标签: settings app01-templatetags-my_test.py 1 先去setting里面把app名字配置上 (除非新加的一般都是弄好的) 2 再app目录下创建一个templatetags模块 3 写py文件(my_test.py) 4 from django import template 5 register=template.Library() 6 写函数 [email protected]_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 %} #以空格做分割,传参数 @register.simple_tag(name=yy) @register.simple_tag(is_safe=False) 默认是true,防止xss攻击,显示字符串。false浏览器直接解释标签 自定义的过滤器,可以放在if判断里, 自定义的标签,不能放在if判断里条件里 静态文件写活: css路径修改的话html引用不必改变 index.html: {% load static %} <link rel="stylesheet" href="{% static ‘mycss.css‘ %}"> 写死的 <link rel="stylesheet" href="/static/mycss.css"> 练习: 自定义一个标签(输入一个值,计算出阶乘,显示再页面) 自定义一个过滤器 (输入两个参数,做累加,支持数字,字符串(如果一个数字,一个字符串,强行相加))
技术分享图片
from django import template

register=template.Library()

@register.filter
def myadd(value,arg):
    if type(value) == type(arg) == int or type(value) == type(arg) == str:
        return value+arg
    elif type(value) == int and type(arg) == str:
        return str(value) + arg
    elif type(value) == str and type(arg) == int:
        return value + str(arg)
    else:
        return 参数只能是数字或字符串

@register.simple_tag
def myfactorial(n):
    if type(n) != int:
        # raise ValueError
        return ValueError
    if n == 0 or n == 1:
        return 1
    else:
        return (n*myfactorial(n-1))
自定义标签
技术分享图片
from django.shortcuts import render

from django.utils.safestring import mark_safe
# Create your views here.

class Person:
    def __init__(self,name):
        self.name = name

    @classmethod
    def class_test(cls):
        print(class method)
        return class method
    def test(self):
        print(method)
        return self.name

    # def __str__(self):
    #     return self.name


def index(request):

    n1 = 1
    n2 = 2
    n3 = 5
    s1=a
    s2=b

    ss=lqz is big
    i=20
    ll=[lqz,18,[1,2,[2,3]]]
    ll4=[[1,2,3],[2,3,4],[1,2,9]]
    dic={name:lqz,age:18,t:[1,2,[2,3]]}
    b=True
    lqz=Person(lqz)
    egon=Person(egon)
    xiaohou=Person(xiaohou)
    monkey=Person(monkey)
    ll2=[lqz,egon,xiaohou,monkey]
    dic2={lqz:lqz,egon:egon}
    # print(lqz.class_test())
    # print(dic[‘name‘].upper)
    ll3=[]
    ss2=‘‘
    ss3=<a href="https://www.baidu.com">点我</a>
    # ss3=mark_safe(ss3)
    import datetime
    now=datetime.datetime.now()
    file=1024*1024*1024


    return render(request,index.html,locals())
    # return render(request,‘index.html‘,{‘ss‘:ss,})  建议使用这种
视图函数
技术分享图片
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
    {% load static %}
    <link rel="stylesheet" href="{% static ‘mycss.css‘ %}">
{#    <link rel="stylesheet" href="/staticaa/mycss.css">#}
</head>
<body>
<div>静态文件写活</div>

<hr>

{% load my_tags %}
{#{{ ‘12‘|add }}#}
<p>{{ n1|myadd:n2 }}</p>
<p>{{ s1|myadd:s2 }}</p>
<p>{{ s1|myadd:n2 }}</p>
<p>{{ ‘@#@‘|myadd:33 }}</p>
{% myfactorial ‘a‘ %}


自定义的过滤器,可以放在if判断里,
自定义的标签,不能放在if判断里条件里
<hr>

<h3>变量</h3>
<p>字符串:{{ ss }}</p>
<p>数字:{{ i }}</p>
<p>列表:{{ ll }}</p>
<h3>句点符,做深度查询</h3>
<p>列表第2个值:{{ ll.2.2.0}}</p>
<p>布尔类型:{{ b}}</p>
<p>字典:{{ dic }}</p>
<p>字典取值:{{ dic.age }}</p>
<p>字典取值:{{ dic.t.2.1 }}</p>
<p>对象:{{ lqz }}</p>
<p>对象取值:{{ lqz.name }}</p>
<h2>对象方法,不要加括号</h2>
<p>对象方法:{{ lqz.test }}</p>
<p>类方法:{{ lqz.class_test }}</p>
<h3>注释:前端看不到,django给处理了</h3>
{#<p>类方法:{{ Person}}</p>#}

<p>列表对象{{ ll2 }}</p>
<p>列表对象取值{{ ll2.1 }}</p>
<p>列表对象取值,在取值{{ ll2.1.name }}</p>

<p>对象字典{{ dic2 }}</p>
<p>对象字典取值{{ dic2.egon.name }}</p>
<p>空列表的情况就是一个空列表{{ ll3 }}</p>
<p>空字符串的情况    直接替换成空{{ ss2 }}</p>

<h3>xss 跨站脚本攻击
    django为了解决这种攻击行为所以对标签进行了处理 特殊符号替换 浏览器不能直接解释标签只能原样输出
    ,如果想直接让浏览器解释这个标签 需要用 mark_safe()函数 在views中 告诉django不要处理</h3>
<p>a标签 {{ ss3 }}</p>
<h4>字典:{{ ss.upper }}</h4>
<h4>字典:{{ dic.name.upper }}</h4>
&lt

{#<script>alert(dsb)</script>#}
{# xss:比如提交评论 存到数据库 响应到html 浏览器解释 就会弹窗 这就是xss攻击  所以一定要处理 #}

<h2>过滤器</h2>
冒号后不能加空格 now是第一个参数,冒号后面是第二个参数
<p>date过滤器 {{ now|date:‘Y-m-d:H:i:s‘ }}</p>
<p>date过滤器 {{ now|date }}</p>
<hr>
如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:
<p>default过滤器  {{ ss2|default:‘字符串没有值‘ }}</p>
<p>default过滤器  {{ ll3|default:‘列表没有值‘ }}</p>
<hr>
返回值的长度。它对字符串和列表都起作用
<p>length过滤器  {{ ll2|length }}</p>
<hr>
将值格式化为一个 “人类可读的” 文件尺寸 单位是B(例如 ‘13 KB‘, ‘4.1 MB‘, ‘102 bytes‘, 等等)。例如:
<p>filesizeformat过滤器  {{ file|filesizeformat }}</p>
<p>filesizeformat过滤器  {{ 1024|filesizeformat }}</p>
<hr>
切片操作
<p>slice过滤器  {{ ‘lqzisbig‘|slice:‘1:4‘ }}</p>
<hr>
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾
带空格的字符串不算点的数量
不带空格的字符串算点的数量
<p>truncatechars过滤器  {{ ‘lqzisbigdddddddeee‘|truncatechars:9 }}</p>
<p>truncatewords过滤器:  {{ ‘lqz is big and egon is small‘|truncatewords:3 }}</p>
<hr>

<p>safe过滤器:  {{ ss3|safe }}</p>
{#可以在视图函数里处理 ss3=mark_safe(ss3)#}
<p>{{ ss3 }}</p>
<hr>
俩参数只能传字符串和数字 相加,具体详见源码
<p>add过滤器:  {{ 12|add:"3" }}</p>
<p>add过滤器:  {{ ‘eee‘|add:"3rrr" }}</p>

<hr>
<h1>模板语法之标签</h1>

{% for foo in ll %}
    <p>{{ forloop }}</p>
    <p>{{ forloop.counter }}</p>
    <p>{{ forloop.counter0 }}</p>
    <p>{{ forloop.revcounter }}</p>
    <p>{{ forloop.revcounter0 }}</p>
    <p>{{ forloop.first }}</p>
    <p>{{ forloop.last }}</p>
    {% if forloop.first %}
        lqz is big
        {% elif forloop.last %}
        俩人都小
        {% else %}
        egon is small

    {% endif %}

    <p>{{ foo }}</p>

{% endfor %}
<hr>
{% for foo in ll %}
    <p>{{ foo }}</p>
    {% empty %}
     没有值
{% endfor %}
<hr>
{% for foo in ll3 %}
    <p>{{ foo }}</p>

    {% empty %}
    一定要放在for循环中
     没有值
{% endfor %}
<hr>

{% for foo in ll4 %}
    {% for i in foo %}
        <p>{{ forloop }}</p>
       <p>{{ forloop.parentloop }}</p>


    {% endfor %}

{% endfor %}
<hr>

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

{% with ttttt=dic.name %}
    相当于重新赋值
    <p>{{ dic.name }}</p>
    <p>{{ ttttt }}</p>
    <p>{{ ttttt }}</p>
    <p>{{ ttttt }}</p>


{% endwith %}

<hr>

<hr>
</body>
</html>
模板层

 


以上是关于模板层的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段1——vue主模板

VSCode自定义代码片段2——.vue文件的模板

VSCode自定义代码片段(vue主模板)

Eclipse 中的通用代码片段或模板

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段