模板语法传值(标签+过滤器)inclusion tag

过滤器{{}}

views.py

def index(request):
n = 1
s = 'hello baby'
l = ['cont']
d = {"name":"jack","age":"19"}
t = (1,2,3,4)
def func():
    return 'func'
#第一种传值方式
# return render(request,'index.html',{'s':s})
#第二种传值方式
# 会将名称空间所有的变量名全部传给前端

class Person(object):
    def __init__(self,name):
        self.name = name
    def walk(self):
        return ('im walking')
p = Person('boy')
return render(request,'index.html',locals())

前端调用方式

{{n}}
{{s}}
{{func}}
<p>{{ p }}</p>
<p>{{ p.walk }}</p>

结果:1hello babyfunc
<app01.views.index..Person object at 0x000001AC0F4F1F98>
im walking

结论:函数名通过django的模板语法传递时,把函数名放在中括号里,会自动执行函数并获取其结果。类实力化的对象也可以被当作参数传递,传递过去的结果是其返回值。前端获取容器类型的数据同意使用 句点符(.)

views.py

def index(request):
    s = 'hello baby'
    size = 1324
    return render(request,'index.html',locals())
    from datetime import datetime 
    ctime = datetime.now()
    <p>{{ s|slice:'0:8:2' }}</p>

index.html

{#自动将|前面的对象当作参数传递给后面的方法#} 

{#length为返回字符串长度#}
<p>{{ s|length }}</p>

{#ln为空时返回默认是default#}
<p>{{ n|default:'这里是空值啊' }}</p>
{#文件大小解析#}
<p>{{ size|filesizeformat }} </p>
{#时间处理#} 
<p>{{ ctime|date:'Y-m-d' }}</p>
{#切片处理,此处0-8取值,步长2#} 
<p>{{ s|slice:'0:8:2' }}</p>  
{#如果字符串大于5个,那么会被截断,并且加上...#}
<p>{{ s|truncatechars:5 }}</p> 
<p>{{ size|add:1000 }}</p>



10
这里是空值啊
1.1KB
2019-04-16
hlob
2124
总结:过滤器会将左边的值当作第一个参数出啊递给后面的过滤器,后面的值当作第二个参数传递给过滤器

重点部分:
views.py

h = <h1>我是h1</h1>
ss=alert('1111')

html中,采用安全模式,就会给你解析html文档

<p>{{ h|safe }}</p>
ss = " <script>alert('123')</script>"

结果:(如果不采用safe模式,就会打印原文档<h1>我是h1</h1>)
在这里插入图片描述
结论:safe模式是为了防止脚本攻击。解析传递过来值时,如果是一个死循环,那么网站就会整体陷入死循环而无法工作。|safe在这里起到取消转义的效果。

后端进行safe处理

from django.utils.safestring import mark_safe 
ss1 = mark_safe('<h1>我是h1</h1>')

这样再传给前端html解析

{{ss1}}

结果:与前端safe模式处理的结果一致
在这里插入图片描述

标签{%%}

views.py

 l = [1,2,3,'four']

html中

{#简单的for循环#}
{% for foo in  l %}
<p>{{ forloop }}</p>
{% endfor %}
{#简单的if判断#}
{% if l %}
<p>有l这个值</p>
{% elif forloop.last%}
<p>最后一次了<p>
{% else %}
<p>没有l这个值</p>
{% endif %}

打印结果

{‘parentloop’:{},‘counter0’:0,‘counter’:1,‘revcounter’:4,‘revcounter0’:3,‘first’:True,‘last’:False}
{‘parentloop’:{},‘counter0’:1,‘counter’:2,‘revcounter’:3,‘revcounter0’:2,‘first’:False,‘last’:False}
{‘parentloop’:{},‘counter0’:2,‘counter’:3,‘revcounter’:2,‘revcounter0’:1,‘first’:False,‘last’:False}
{‘parentloop’:{},‘counter0’:3,‘counter’:4,‘revcounter’:1,‘revcounter0’:0,‘first’:False,‘last’:True
有l这个值

其中大小的比较请参考以下链接,这里不作赘述:https://www.cnblogs.com/huchong/p/7930857.html
如果要获取字典内的(字典、列表)可以直接用 参数名.的形式获取。

自定义过滤器{{ }}和自定义(逻辑相关)标签{% %}

必做前三步:
1.必须新建一个名为templatetags的文件夹
2.在该文件夹下创建一个任意名的py文件
3.在该文件夹内必须先写上两句话
from django import template
register = template.Library()

views.py下

xx=1

自定义my_tag.py 文件下

#自定义过滤器 {{ }}
@register.filter(name='baby')
def my_sum(a,b):
    return a+b

#自定义标签 {% %}
@register.simple_tag(name='plus')
def plus(a,b,c):
    return  '%s-%s-%s'%(a,b,c)

html下

{##加载自定义模块}
{% load my_tag %}

{##j自定义过滤器}
{{ xx|baby:2 }}

{#自定义标签#}
{% plus xx 'hello' 'world'  %}

之后的用法和过滤器用法相同

3
1-hello-world

注意:自定义过滤器可以在for循环中使用,而自定义的标签不可以。因为for 和 if 关键字中两边有%会与标签的%重叠。
在这里插入图片描述

成功了

结论:自定义的标签不可以在if 和 for 中使用
自定义的过滤器可以在其中使用。

拓展:
自定义inclusion_tag
调用自定义的inclusion_tag可以返回一段html代码(比如form表单、表格、列表),应用场景是动态生成的一块数据。

思路分析:返回给login.html 传10 给my_tag.py下的n,返回l给login.html.最终把渲染后的文件传递给index.html
调用自定义inclusion_tag 能够返回一段html代码,可以用与网页的动态生成(比如form表单、表格、列表)

后端mytag.py

@register.inclusion_tag('temp.html')
def get_html(n):
    l = []
    for i in range(n):
        l.append('第%s项'%i)
    return {'l':l}

	

前端模板 temp.html

{#["第0项","第1项","第2项"]#}
{% for foo in l %}
<li>{{foo}} <li>
{% end for %}

调用页面index

{%load mytag%}
{ get_html 5}

html结果在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值