模板语法之传值

Django提供的两种模板语法:

  • {{ 变量名}}:用于变量相关操作(引用)
  • {% 标签名 %}:用于逻辑相关操作(循环、判断)

传值的两种方式

指名道姓的传

return render(request, 'index.html', {'name':name})

打包传值

# locals() 将当前名称空间中所有的名字全部传递给`html`页面
return render(request, 'index.html', locals())

传值的范围

  • 函数名:模板语法会自动加括号执行,并将函数的返回值展示到页面上不支持传参(模板语法会自动忽略有参函数)
  • 文件名:直接显示文件IO对象
  • 类名:自动加括号实例化成对象
  • 对象名:显示对象的地址,并且具有调用属性和方法的能力

传值使用

Django模板语法中针对容器类型的取值只有一种方式句点符,既可以点key,也可以点索引 Django内部自动识别

模板语法之内置过滤器

过滤器是把视图传入的变量值加以修饰后再显示

语法

{{ 变量名|过滤器名:传给过滤器的参数 }}  # 过滤器最多只能传输一个参数

常用内置过滤器

length

作用:统计数据的长度,对字符串、列表、字典等容器类型都起作用

{{ value|length }}

add

作用:算术加法或者字符串加法

{{ value|add:111 }} 
{{ value|add:'aaa'}}

filesizeformat

作用:将数字转成合适的文件计量单位

{{ value|filesizeformat }}

default

作用:如果一个变量值是False或者为空,使用default后指定的默认值,否则,使用变量本身的值

{{ value|default:"nothing" }}

date

作用:将日期按照指定的格式输出

{{ value|date:'Y-m-d' }}

slice

作用:对输出的字符串进行切片操作,顾头不顾尾

{{ value|slice:'0:10' }}

truncatewords

作用:按照空格截取指定个数的文本(不包含三个点)

{{ value|truncatewords:3 }}

truncatechars

作用:按照字符个数截取文本(包含三个点)

{{ value|truncatechars:6 }}

cut

作用:移除指定的字符

{{ value|cut:'|' }}

safe

作用:出于安全考虑,Django的模板会对HTML标签、JS等语法标签进行自动转义,如果不想被转以使用safe

{{ value|safe }}

后端也可以写好直接传入前段

from django.util.safestring import make_safe

t = '<script>alert(123)</script>'
res  = make_safe(t) 

更多过滤器

过滤器说明
add加法
addslashes添加斜杠
capfirst首字母大写
center文本居中
cut切除字符
date日期格式化
default设置默认值
default_if_none为None设置默认值
dictsort字典排序
dictsortreversed字典反向排序
divisibleby整除判断
escape转义
escapejs转义js代码
filesizeformat文件尺寸人性化显示
first第一个元素
floatformat浮点数格式化
force_escape强制立刻转义
get_digit获取数字
iriencode转换IRI
join字符列表链接
json_script生成script标签,带json数据
last最后一个
length长度
length_is长度等于
linebreaks行转换
linebreaksbr行转换
linenumbers行号
ljust左对齐
lower小写
make_list分割成字符列表
phone2numeric电话号码
pluralize复数形式
pprint调试
random随机获取
rjust右对齐
safe安全确认
safeseq列表安全确认
slice切片
slugify转换成ASCII
stringformat字符串格式化
striptags去除HTML中的标签
time时间格式化
timesince从何时开始
timeuntil到何时多久
title所有单词首字母大写
truncatechars截断字符
truncatechars_html截断字符
truncatewords截断单词
truncatewords_html截断单词
unordered_list无序列表
upper大写
urlencode转义url
urlizeurl转成可点击的链接
urlizetruncurlize的截断方式
wordcount单词计数
wordwrap单词包裹
yesno将True,False和None,映射成字符串‘yes’,‘no’,‘maybe’

为模版过滤器提供参数的方式是:过滤器后加个冒号,再紧跟参数,中间不能有空格!

模板语法之标签

if标签

对一个变量求值,如果它的值True这个内容块就会输出:

{% if 条件1 %}
    <p>条件1成立,打印此消息</p>
{% elif 条件2 %}
    <p>条件2成立,打印此消息</p>
{% else %}
<p>条件1、2都不成立,打印此消息</p>
{% endif %}

补充:if语句支持 andor==><!=<=>=innot inisis not判断

for标签

循环对象中的每一个元素

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

遍历一个字典

{% for k,v in dic.item %}
    <p>{{ k }}:{{ v }}</p>
{% endfor %}

循环序号可以通过{{ forloop }}显示

变量名描述
forloop.counter循环计数器,表示当前循环的索引(从 1 开始)。
forloop.counter0循环计数器,表示当前循环的索引(从 0 开始)。
forloop.revcounter反向循环计数器(以最后一次循环为 1,反向计数)。
forloop.revcounter0反向循环计数器(以最后一次循环为 0,反向计数)。
forloop.first当前循环为首个循环时,该变量为 True
forloop.last当前循环为最后一个循环时,该变量为 True
forloop.parentloop在嵌套循环中,指向当前循环的上级循环

当传递到 for 标签中的数组不存在或为空时,可以使用 {% empty %} 标签来指定输出的内容

  {% for i in l1 %}
    {% if forloop.first %}
        <p>这是第一次循环</p>
    {% elif forloop.last %}
        <p>这是最后一次循环</p>
    {% else %}
        <p>中间循环</p>
    {% endif %}
    {% empty %}
        <p>for循环对象为空 自动执行</p>
  {% endfor %}

更多标签

标签说明
autoescape自动转义开关
block块引用
comment注释
csrf_tokenCSRF令牌
cycle循环对象的值
debug调试模式
extends继承模版
filter过滤功能
firstof输出第一个不为False的参数
for循环对象
for … empty带empty说明的循环
if条件判断
ifchanged如果有变化,则..
include导入子模版的内容
load加载标签和过滤器
lorem生成无用的废话
now当前时间
regroup根据对象重组集合
resetcycle重置循环
spaceless去除空白
templatetag转义模版标签符号
url获取url字符串
verbatim禁用模版引擎
widthratio宽度比例
with上下文变量管理器

使用文档:https://docs.djangoproject.com/zh-hans/4.0/ref/templates/builtins/

自定义过滤器与标签

  1. 在应用下需要创建一个名为templatetags的文件夹
  2. templatetags文件夹任意新建一个py文件,在该文件中自定义过滤器或标签
  3. 在该py文件内需要先提前编写两行固定的代码
    from django import template
    register = template.Library()

自定义过滤器

# 自定义过滤器:最多只能接收两个参数
@register.filter(is_safe=True)
def index(a, b):  // 参数传递为a=value,b=666
    return a + b  
{{% load my_tags %}}  // 必须先加载自定义过滤器和标签的文件,一个html页面加载一次就可以了
{{ value|index:666 }}

自定义标签

# 自定义标签:可以接收任意的参数
@register.simple_tag
def func(a, b, c, d):
    return a + b + c + d
{% func 1 2 3 4 %} // 参数之间空格隔开即可

可以指定name

@register.simple_tag(name='my_tag')
def func(a, b, c, d):
    return a + b + c + d
{% my_tag 1 2 3 4 %}

自定义inclusion_tag

该方法需要先作用于一个局部html页面,之后将渲染的结果放到调用的位置

# 自定义inclusion_tag
@register.inclusion_tag('left.html')
def func2(n):
    l1 = []
    for i in range(1, 1 + n):
        l1.append(f'第{i}页')
    return locals()
// left.html
<ul>
    {% for i in l1 %}
        <li>{{ i }}</li>
    {% endfor %}
</ul>
{% func2 10 %}

模板的导入

在一个模板文件中,“引入”另外一个模板文件的内容

语法

{% include '模版名称' %}

使用

menu.html

<p>这是一个菜单</p>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div class="h2">
    {% include 'menu.html' %}
    {% include 'menu.html' %}
    {% include 'menu.html' %}
    {% include 'menu.html' %}
</div>
</body>
</html>

模板的继承

继承父模版页面,可以在子模版使用该页面上面所有的资源

语法

父模版

{% block 名称 %}
...
{% endblock %}

子模版

{% extends "模版名称" %}

使用

父模版

先在模板中通过block定义那些区域内容可以被修改

<h4>个人信息</h4>
<p>姓名:{% block name %}(请自定义){% endblock %}</p>
<p>年龄:{% block age %}(请自定义){% endblock %}</p>

子模版

子模板继承父模板,并修改划定的区域

<html>
<body>    
    {% extends "menu.html" %}

    {% block name %}kevin{% endblock %}
    {% block age %}22{% endblock %}
</body>
</html>

image-20220517162546150

block 标签的部分已经被自定义的内容替换掉了,如果没有修改规定区域,将会继续使用父模板中的内容。如果想要在父模板 block中新增内容而不是完全覆盖,可以使用{{ block.super }}

<html>
<body>

    {% extends "menu.html" %}


    {% block name %}kevin{% endblock %}
    {% block age %}22{{ block.super }} (新增的内容){% endblock %}
</body>
</html>
Last modification:May 29, 2022
如果觉得我的文章对你有用,请随意赞赏