模板语法传值(标签+过滤器)inclusion tag
过滤器{{}}
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的模板语法传递时,把函数名放在中括号里,会自动执行函数并获取其结果。类实力化的对象也可以被当作参数传递,传递过去的结果是其返回值。前端获取容器类型的数据同意使用 句点符(.)
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模式处理的结果一致
标签{%%}
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结果