Welcome to kimi's blog

django之模板层(template)

模板层

模板传值

"""
模板层三种语法
{{}}:主要与数据值相关
{%%}:主要与逻辑相关
{##}:模板注释

django的模板语法是自己写的 跟jinja2不一样

1.针对需要加括号调用的名字 django模板语法会自动加括号调用你只需要写名字就行
2.模板语法的注释前端浏览器是无法查看的 {##},模板语法{##}是由后端处理的,当识别为模板注释时就会从html文件中移除了,不会返回给用户;而html注释<!---->是由前端浏览器对html处理时渲染时不做处理,但检查网页源码时还是能看见这些注释的。

"""

1.模板语法传值  字典和locals()
    return render(request, 'demo02.html', {'n1': name, 'a1': age})  
	# 传值方式1:精准传值 不浪费资源 针对多资源的传递书写麻烦
    return render(request,'demo02.html', locals())  
	# 传值方式2:将函数名称空间中所有的名字全部传递 名字过多并且不使用的情况下比较浪费资源

模板语法传值特性

1.基本数据类型正常展示
2.文件对象也可以展示并调用方法
3.函数名会自动加括号执行并将返回值展示到页面上(不支持额外传参)
4.类名也会自动加括号调用
5.对象不会加括号,但可以获取对象的一些数据属性
6.索引、键、属性只能通过句点的方式取
ps:总结针对可以加括号调用的名字模板语法都会自动加括号调用
image

模板语法之过滤器(内置函数)

语法:{{ value|过滤器名:参数 }}

过滤器用管道符隔开(无空格),最多支持多传入一个参数。
过滤器是支持链式的,可以将多个过滤器串起来,上一个过滤器的输出作为下一个的输入
常用的过滤器

过滤器 功能 示例
default 如果一个变量是false或者为空,使用给定的默认值。 否则,使用变量的值。 {{ value|default:"nothing"}}
length 对于字符串列表这类有length属性的,得到其值 {{ value|length}}
filesizeformat 将传入的数字当做文件的字节数,将其处理成合适展示的文件大小,如2048就会展示为2 KB {{ value|filesizeformat }}
slice 对字符串进行切片 {{value|slice:"2:-1"}}
add 将传入的数字或字符串做相加或拼接处理 {{value|add:1}}
safe 模板语法默认转义带html语法的文本,safe取消标签文本转义,让其可以被html渲染 {{ value|safe}}
truncatechars 如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。 {{ value|truncatechars:9}}
truncatewords 在一定数量的字后截断字符串,处理同上...。 {{ value|truncatewords:9}}
cut 移除value中所有的与给出的变量相同的字符串如果value为'i love you',那么将输出'iloveyou'. {{ value|cut:' ' }}
timesince datetime数据距离现在的时间(从现在起) {{ blog_date|timesince }}
timeuntil datetime数据距离现在的时间(到现在止) {{ blog_date|timesince }}
date datetime数据字符化输出 {{ value|date:"Y-m-d H:i:s"}}

模板层之标签

数据来源djangoproject

标签之forloop关键字

forloop模板语法自带的变量名

标签之if判断

格式:
{% if 条件1(可以自己写也可以用传递过来的数据) %}
        <p>今天又是周三了</p>
{% elif 条件2(可以自己写也可以用传递过来的数据) %}
        <p>我是列表</p>
{% else %}
        <p>我是else分支的!</p>
{% endif %}


eg:
    # if判断
判断a是True打印
 {% if a %}
    <p>今天又是周三了</p>
 {% elif l1 %}
     <p>我是列表</p>
{% else  %}
     <p>我是else分支的</p>
 {% endif %}

判断a传过来是true,打印今天又是周三了;a为false,则打印我是列表
a和l1都为false,则打印else分支

标签之for循环

image

解析:    
forloop内置对象:运行结果解析
'counter0': 从0开始计数    
'counter' : 从1开始计数    
 
'first': True,判断循环的开始
'last' : Tues,判断循环的结束

for循环可用的一些参数:

Variable Description
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是不是第一次循环(布尔值)
forloop.last 当前循环是不是最后一次循环(布尔值)
forloop.parentloop 本层循环的外层循环

for循环代码展示:

{% for i in l1 %}
    <p>{{ forloop }}</p>
    <p>{{ i }}</p>
{% endfor %}

前端页面展示

image

标签for与if混合使用及标签之empty

# for与if混合使用
{% for foo in l1 %}
    {% if forloop.first %}
        <p>这是我第一次循环</p>
    {% elif forloop.last %}
        <p>我是最后一次循环</p>
    {% else %}
        <p>{{ foo }}</p>

    {% endif %}
        {% empty %}
        <p>for循环的可迭代对象内部没有元素,根本没法循环</p>
{% endfor %}


解析:
forloop.first: 判断本次循环是不是第一次,是,就执行下面的代码
forloop.last: 判断本次循环是不是最后一次,是,就执行下面代码
empty: 你给我传的数据是空的无法循环取值(空字符串、空列表、空字典)

image

循环字典

indexPage.html

# 循环字典
1.循环键
{% for r in d1 %}
        <p>{{ r }}</p>
{% endfor %}

2.循环键keys
{% for foo in d1.keys %}
    <p>{{ foo }}</p>
{% endfor %}

3.循环值values
{% for foo in d1.values %}
    <p>{{ foo }}</p>
{% endfor %}

4.items
{% for foo in d1.items %}
    <p>{{ foo }}</p>
{% endfor %}

解析:
    .items	: 返回可遍历的(键, 值) 元组数组。

image

with起别名

django模板语法取值操作>>>:只支持句点符
句点符既可以点索引也可以点键

 {{ d1.hobby.2.a1 }}

with起别名:拿到字典中a的值

{% with d1.hobby.2.a as a_name  %}
        <p>{{ a_name }}</p>
{% endwith %}
    在with语法内就可以通过as后面的别名快速的使用到前面非常复杂获取数据的方式
    
# 输出  我是a

命名规范: 只能在with代码块儿的范围之内才能使用别名

模型层的views.py

def index_func(request):
    a=100
    # a=True
    # l1=[12,23,34,45,56,67]
    L1=[]
    s=(11,22,33,44)
    d1={'name':'kimi','age':19,'hobby':['read','music',{'a':'我是a','b':'我是b'}]}
    return render(request,'indexPage.html',locals())

自定义过滤器、标签及inclusion_tag(了解)

如果想要自定义一些模板语法 需要先完成下列的三步走战略

1.在应用下创建一个名字必须叫templatetags的目录
2.在上述目录下创建任意名称的py文件	,如mytag.py
3.在上述py文件内先编写两行固定的代码
	from django import template
	register = template.Library()

1.自定义过滤器(最大只能接收两个参数)

1.mytag.py
from django import template
register = template.library()

# 自定义过滤器(最大只能接收两个参数)
# 参数    过滤器    过滤器名字
@register.filter(name='myadd')
def my_sum(a,b):
    return a+b
2.indexPage.html
# 加载过滤器
{% load mytags %}
<p>{{ n|myadd:100 }}</p>
3.后端
def index_func(request):
    n=888
    return render(request,'indexPage.html',locals())

4.前端页面结果是:988

2.自定义标签(参数没有限制)

1.mytag.py
from django import template
register = template.library()

# 自定义标签(参数没有限制)
# 参数    过滤器    过滤器名字
@register.simple_tag(name='mytag')
def my_tag(a,b,c,d):
    return f'{a}-{b}-{c}-{d}'
2.indexPage.html
# 加载过滤器
{% load mytags %}
<p>{%mytag 'kimi' 'jason' 'kiki' 123 %}</p>

4.前端页面渲染结果是:

image

3.自定义inclusion_tag(局部的html代码)

1.mytag.py
from django import template
register = template.library()

# 自定义局部html
@register.inclusion_tag('menu.html',name='mymenu')
def my_menu(n):
    html=[]
    for i in range(n):
        html.append('<li>第%s</li>'%i)
    return  locals()

2.indexPage.html
# 加载过滤器
{% load mytag %}
{% mymenu 10 %}

3.自定义的网页html
    <ul>
        {% for foo in html %}
                {{ foo|safe }}
        {% endfor %}
    </ul>

4.前端页面渲染结果是:

image

总结:

1.自定义过滤器和自定义标签:在页面上通过特殊的语法,然后能调用mytag.py的函数,将函数返回值调用到标签或者过滤器的位置

2.自定义:在页面上通过特殊的语法,然后能调用py的函数将函数返回值传给到局部的页面html,将返回值渲染后返回给函数

模板的 继承与导入

模板的继承

当我们多个页面有相似的页面,我们可以采用下列方法

1.我们直接复制粘贴>>>创建一个新的html

2.模板的继承

1.在模板中使用block划定子板>>方便以后修改的区域
	{% block 区域名称 %}
    {% endblock%}
2.子版继承母板
	{% extends 'home.html'%}
	{% block 区域名称 %}
    	子板自己的内容
    {% endblock%}
    
注意:子板也可以继续使用子模板的内容
	{{block.super}}

关于模板中的继承,,至少有三个区域的模板可以继承去渲染,分别是页面内容区、CSS样式区、JS代码区
image

模板的导入

提前将被导入的html页面写好,其他html页面想使用就可以导入

导入的格式

 {% include '导入的html文件名'%}
eg:
    {% include 'myform.html'%}
posted @ 2022-12-14 21:58  魔女宅急便  阅读(37)  评论(0)    收藏  举报
Title