模板语法

模板语法传值

django提供的模板语法只有两个符号:

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

传值方式

传值方式一:使用render()方法传值(适用于数据量较少的情况, 节省资源)

后端传值:

def index(request):
    return render(request, 'index.html', {'name': 'tom', 'age':18})

前端获取:

<h1>{{ name }}</h1>
<h1>{{ age }}</h1>

传值方式二:使用locals()方法传值,它会将当前名称空间中所有的名字全部传递给html页面(适用于数据量较多的情况,浪费资源)

后端传值:

def index(request):
    name = 'tom'
    age = 18
    return render(request, 'index.html', locals())

前端获取:

<h1>{{ name }}</h1>
<h1>{{ age }}</h1>

传值范围

1.基本数据类型都可以。

2.函数名:模板语法会自动加括号执行并将函数的返回值展示到页面上,并且只会执行无参函数,如果是有参函数,模板语法会自动忽略。

3.文件名:直接显示文件IO对象。

4.类名:自动加括号实例化成对象,并显示对象的地址,同时具备调用属性和方法的能力。

5.对象名:直接显示对象的地址,并且具备调用属性和方法的能力。

取值补充

django模板语法针对容器类型的取值,只有一种方式:句点符。

比如我传了一个容器类型数据:

data = {
    'name': [
        1, {'age':18}
    ]
}

前端获取age的值

{{ data.name.1.age }}

模板语法之过滤器

过滤器类似于内置函数,但是这种内置函数最多只能额外传输一个参数。

语法结构:

{{ 数据对象|过滤器名称:参数 }}

常见过滤器

过滤器 作用
s|length 计算数据s的长度
s|add:x 将s与x相加
s|filesizeformat 将数字s转成合适的文件计量单位(KB、MB..)
s|deafult:'x' 判断数据s的布尔值是否是False,是则返回x
s|date:'x' 将时间s格式化成x
s|slice:'m:n' 索引切片,相当于s[m,n]
s|truncatewords:x 按照空格截取x个文本,多出来的用省略号显示
s|truncatechars:x 截取x个字符,多出来的用省略号显示
s|cut:'x' 移除指定的字符x
s|safe 将s按照html格式转换

针对safe过滤器,我们也可以在后端实现:使用mark_safe方法后将结果传给页面,页面就能识别标签语法了。

from django.utils.safestring import mark_safe
tag = '<h1">内容</h1>'
res = mark_safe(ttt)

image

模板语法之标签

语法结构:

{{ 标签名称... }}
	内容
{{ end标签名称 }}

if判断

{% if 条件1 %}
	内容
{% elif 条件2 %}
	内容
{% else %}
	内容
{% endif %}

for循环

{% for 变量 in 容器类型 %}
	内容
{% empty %}
	for循环对象为空时执行
{% endfor %}

其中{% empty %}可不写。

对于for循环,模板语法还提供了forloop关键字,是一个字典类型数据,里面存储了一些for循环的信息:{{ forloop }}

{
    'parentloop': {},
    'counter0': 0,  # 从0计数,0代表for循环的第一次 
    'counter': 1,  # 从1计数,1代表for循环的第一次 
    'revcounter': 4,  # counter相反的结果
    'revcounter0': 3,  # counter0相反的结果
    'first': True,  # 是否是第一次循环
    'last': False  # 是否是最后一次循环
}

补充:针对字典同样提供了keys、values、items方法

自定义过滤器、标签、inclusion_tag

自定义过滤器、标签需知:

  1. 自定义过滤器、标签是在py文件中自定义的。
  2. 在应用下需要创建一个名为templatetags的文件夹,并在这个文件夹中创建py文件。
  3. py文件名称任意。
  4. 该py文件内需要先提前编写两行固定的代码
from django import template
register = template.Library()
  1. 使用时需要先使用模板语法导入py文件名
{% load py文件名 %}

自定义过滤器

自定义过滤器只能接收两个参数,第一个形参接收调用过滤器的数据,第二个形参接收自己填写的数据,比如自定义一个相减的过滤器

@register.filter
def reduce(a, b):
    return a - b

使用:将s减5

{% load py文件名 %}
{{ s|reduce:5 }}

自定义简单标签

自定义简单标签可以接收任意的参数。

@register.simple_tag(name='func')
def f(a, b, c):
    return a + b + c

使用:

{% load py文件名 %}
{% func 1 2 3 %}

对于自定义标签,需要设置name属性才能使用,并且使用时是用{%%}这个符号的。

自定义inclusion_tag

inclusion_tag可以把写好的一些标签放入到网页中。

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

@register.inclusion_tag('content.html')
def func(n):
    l1 = [i for i in range(n)]
    return l1

content.html

<ul>
    {% for i in l %}
        <li>{{ i }}</li>
    {% endfor %}
</ul>

页面调用:

{% func 10 %}

image

模板语法之导入

类似于将html页面上的局部页面做成模块的形式,哪个地方想要直接导入即可展示。

比如我想要让home.html与index.html一样,那么我只需要将index.html导入到home.html中即可。

home.html

{% include 'index.html' %}

模板的继承

类似于面向对象的继承:继承了某个页面就可以使用该页面上所有的资源,继承后我们就可以根据页面进行局部更改。

使用:

首先先在通过block划定将来可以被修改的区域:

{% block 区域名称 %}
	标签内容
{% endblock %}

子页面继承:

{% extends '父页面' %}

子页面修改可以被修改的区域:

{% block 区域名称 %}
	标签内容
{% endblock %}

子页面还可以重复使用父页面的内容:

{% block 区域名称 %}
	{{ block.super }}
	{{ block.super }}
	...
{% endblock %}

补充:

一般来说,一个页面上最少应该有三个区域:css区域、内容区域、js区域,这样子页面就可以有自己独立的css、js、内容。

模板语法之注释

模板语法的注释

{# 注释内容 #}

HTML的注释可以在前端浏览器页面上直接查看到,模板语法的注释只能在后端查看,前端浏览器查看不了。

posted @ 2022-05-16 18:50  Yume_Minami  阅读(144)  评论(0编辑  收藏  举报