模板渲染

语法

变量 {{ }}

逻辑{% %}

注释 {# #}

变量

当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身。 变量的命名包括任何字母数字以及下划线 ("_")的组合。 变量名称中不能有空格或标点符号。

def get(self,request):
    num = 1
    name = "张三"
    li = [1,2,3,4]
    dic = {"1":"a","2":"b"}
    class Cl():
        count = "abc"
        def foo(self):
            print("foo")
    # return render(request,"index.html",{"num":num,"name":name,"li":li,"dic":dic,"cl":cl})
    return render(request,"index.html",locals())
<h1>{{ num }}</h1>
<h1>{{ name }}</h1>
<h1>{{ li }}</h1>
<h1>{{ dic.k1}}</h1>
<h1>{{ dic.keys }}</h1>
<h1>{{ dic.values }}</h1>
<h1>{{ dic.items }}</h1>
<h1>{{ Cl.count }}</h1>
<!--通过点可以进行字典查询、属性或方法查询、索引查询-->

过滤器

在Django的模板语言中,通过使用 过滤器 来改变变量的显示。

语法:
使用管道符"|"来应用过滤器。

{{ name|lower }}

注意事项:

  • 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
  • 过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
  • 过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:’, ’ }}
  • '|'左右没有空格没有空格没有空格

内置过滤器

标签描述
default设置默认值
length获取长度
filesizeformat转换值
slice切片
date格式化时间
safe转义html和js
truncatechars截取字符串
truncatewords截取字符串
cut去除指定字符
join拼接字符串
timesince将日期格式设为自该日期起的时间

default

设置默认值如果变量是flase或为空时使用设置的默认值

<h1>{{ num|default:"默认值" }}</h1>

length

获取长度

<h1>{{ li|length }}</h1>

filesizeformat

将值转换为方便读取的格式

<h1>{{ size|filesizeformat }}</h1>

slice

切片

<h1>{{ name|slice:"1:3" }}</h1>

date

格式化时间

<h1>{{ date|date:"Y-m-d H:i:s" }}</h1>

safe

转义html和js

truncatechars

截取字符串,如果截取数小于原数长度则隐藏部分显示三个点,每个点占一个截取数

<h1>{{ name|truncatechars:6}}</h1>
<!--结果:abc...-->

truncatewords

在一定数量的字后截断字符串,截取的是多少个单词。

<h1>{{ name|truncatewords:2}}</h1>
<!--结果:ab cd ...-->

cut

对字符串去除指定字符

<h1>{{ name|cut:"a"}}</h1>
<!--结果:b cd ef ghi-->

join

按指定字符拼接

<h1>{{ li|join:"+" }}</h1>
<!--结果:1+2+3+4-->

timesince

将日期格式设为自该日期起的时间

{{ blog_date|timesince:comment_date }}

标签

标签比变量更加复杂:在输出中创建文本,通过循环或逻辑来控制流程,标签需要开始和结束标签 。

for标签

遍历每一个元素

<!--正序-->
{% for i in li %}
    <span>{{ i }}</span>
{% endfor %}

<!--倒序-->
{% for i in li reversed %}
    <span>{{ i }}</span>
{% endfor %}

<!--找不到或为空时执行empty-->
{% for i in li %}	
    <span>{{ i }}</span>
{% empty %}
    <p>sorry,no person here</p>
{% endfor %}

循环序号

<!--
forloop.counter            当前循环的索引值(1开始),forloop是循环器,通过点来使用功能
forloop.counter0           当前循环的索引值(从0开始)
forloop.revcounter         当前循环的倒序索引值(从1开始)
forloop.revcounter0        当前循环的倒序索引值(从0开始)
forloop.first              当前循环是不是第一次循环(布尔值)
forloop.last               当前循环是不是最后一次循环(布尔值)
forloop.parentloop         本层循环的外层循环的对象,再通过上面的几个属性来显示外层循环的计数等
-->
{% for i in li %}
    <span>{{ forloop.counter }} {{ i }}</span>
{% endfor %}

if 标签

if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断,条件两边都有空格

{% if num > 100 or num < 0 %}
    <p>1</p>
{% elif num > 80 and num < 100 %}
    <p>2</p>
{% else %}
    <p>3</p>
{% endif %}

with标签

使用一个简单地名字缓存一个复杂的变量,多用于给一个复杂的变量起别名

<!--方式1-->
{% with total=business.employees.count %}//等号两端无空格
    {{ total }} <!--只能在with语句体内使用-->
{% endwith %}
<!--方式2-->
{% with business.employees.count as total %}
    {{ total }}
{% endwith %}

自定义标签和过滤器

自定义过滤器

在应用下创建一个templatetags(固定名称)的文件夹,存放自定义的过滤器(过滤器是.py文件)

# 过滤器add
from django import template
register = template.Library() # register是固定名称
@register.filter
def add(a,b): # 最多接受两个参数,第一个参数接受|符前的数据,第二个参数接受|符后传递的数据
    return a+b
<!--使用自定义过滤器-->
<!DOCTYPE html>
<html lang="en">
<!--导入过滤器文件-->
{% load glq %}
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{ name|add:"123" }} <!--使用自定义过滤器,可以放在if for语句中-->
</body>
</html>

自定义标签

自定义标签的参数个数不限,使用前需要先引入自定义标签所在的py文件

# 自定义add.py
from django.utils.safestring import mark_safe
from django import template
register = template.Library()
@register.simple_tag
def add(a,b,c): # 参数个数不限
    return a+b+c
    
@register.simple_tag
def view(a,b):
    return mark_safe("<input type='text' id='%s' class='%s' />" %(a,b,))
<!DOCTYPE html>
{% load add %} <!--引入自定义标签,不需要加py后缀名-->
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% add  name "123" "456" %} <!--使用自定义标签-->
{% view "123" "456" %}
</body>
</html>

inclusion_tag

多用于返回html代码片段,将一个页面里的内容用函数的返回值渲染,作为一个组件加载到调用这个函数的html文件中

# add.py文件
from django import template
register = template.Library()
@register.inclusion_tag("test.html") # 
def add(a): # 可以传入多个参数
    return {"data":a} # 返回数据
<!--test.html-->
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
</head>
<body>
传入数据{{ data }}
</body>
</html>
<!--index页面-->
<!DOCTYPE html>
{% load add %} <!--导入py文件-->
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% add "这是数据" %} <!--使用函数-->
</body>
</html>

组件

可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方使用

<!--module.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>组件页面</h1>
</body>
</html>
<!--index.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% include "module.html" %}
</body>
</html>

模板继承

Django模版引擎中最强大也是最复杂的部分就是模版继承了。模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。

<!--模板页面temp.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div class="c1">
    这是一个模板
</div>
{% block m1 %} <!--预留钩子,其他使用该模板的页面可以替换内容-->
<h1>模板页面内容</h1>
{% endblock %} <!--结束-->
</body>
</html>
<!DOCTYPE html>
{% extends "temp.html" %} <!--导入模板-->
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% block m1 %} <!--定义和模板相同的钩子-->
    {{ block.super }} <!--设置模板页面和子页面内容同时存在-->
    <h1>index</h1>  <!--子页面要替换的内容-->
{% endblock %} <!--结束-->
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值