Django的templates(模板)

django的模板=HTML代码+模板语法

存放于templates目录下的html文件称之为模板文件

如果我们想要返回的html页面中的数据是动态的,那么必须在html页面中嵌入变量,这便用到了django的模板语法

  • 变量

    模板语法符号:{{ 变量名 }},变量相关

    ​ 1.1 深度查询:句点符的应用

    ​ 1.2 过滤器

  • 标签

    模板语法符号:{% 标签名 %},逻辑相关

  • 自定义标签和过滤器

  • 模板的导入和继承

模板传值

变量相关 {{ }}

如果html代码中的数据不是固定死的,而是动态变化的

则必须在html中嵌入变量,为此,模板语法提供了变量的概念,允许我们在html代码中嵌入变量

我们只需要在视图函数中用render方法为html文件中指定的变量赋值即可,具体用法如下

test.html

<p>{{ msg }}</p>
<p>{{ dic }}</p>

我们需要在视图函数中为模板test.html的变量名msg、dic、赋值,views.py内容如下

from django.shortcuts import render

def test(request):
# 传给模板的变量值可以是任意python类型,如下
msg='hello world'
dic={'k1':1,'k2':2}
return render(request,'test.html',{'msg':msg, 'dic':dic}) #指名道姓
#return render(request,'test.html',locals()) # locals会将当前名称空间中所有的变量名全部传递给html页面

注意:

1、render函数的第三个参数包含了要传给模板的变量值,是一个字典类型

该字典中的key必须与模板文件中的变量名相对应,render函数会去templates目录下找到模板文件,然后根据字典中的key对应到模板文件中的变量名进行赋值操作,最后将赋值后的模板文件内容返回给浏览器

2、可以将render函数的第三个参数简写为locals(),如下

return render(request,'test.html',locals())

locals()会将函数test内定义的所有名字与值转换为字典中的k与v

句点符的使用

django模板语法取值 只有一种操作方式 句点符 .

句点符既可以引用容器类型的元素,也可以引用对象的方法

注意:当模板系统遇到一个(.)时,会按照如下的顺序去查询:

  • 在字典中查询
  • 属性或者方法
  • 数字索引
<!--调用字符串对象的upper方法,注意不要加括号,函数和对象会自动加括号-->
<p>{{ msg.upper }}</p> <!--取字典中k1对应的值-->
<p>{{ dic.k1 }}</p> <!--取对象的name属性-->
<p>{{ obj.name }}</p> <!--取列表的第2个元素,然后变成大写-->
<p>{{ li.1.upper }}</p> <!--取列表的第3个元素,并取该元素的age属性-->
<p>{{ li.2.age }}</p>

模板过滤器

过滤器类似于python的内置函数,用来把视图传入的变量值 加以修饰后再显示

{{ 变量名|过滤器名:传给过滤器的参数 }}
| 左边的会当做过滤器的第一个参数,过滤器名右边的会当做过滤器的第二个参数

常用内置过滤器

1 default

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

如果value= ’ ‘ ,则输出“nothing”

{{ value|default:"nothing" }}

2 length

作用:返回值的长度。它对字符串、列表、字典等容器类型都起作用

如果value是 ['a', 'b', 'c', 'd'],那么输出是4

{{ value|length }}

3 filesizeformat

作用:将值的格式化为一个"人类可读的"文件尺寸(如13KB、4.1 MB、102bytes等等)

如果 value 是 12312312321,输出将会是 11.5 GB

{{ value|filesizeformat }}

4 date

作用:将日期按照指定的格式输出,如果value=datetime.datetime.now(),

按照格式Y-m-d则输出2020-01-07

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

5 slice

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

如果value=“santa“,则输出"sa"

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

6 truncatechars

作用:如果字符串字符多于指定的字符数量,那么会被截断。

截断的字符串将以可翻译的省略号序列(“...”)结尾

如果value=”hello world santa“,则输出"hello...",注意8个字符也包含末尾的3个点

{{ value|truncatechars:8 }}

7 truncatewords

作用:同truncatechars,但truncatewords是按照单词截断,注意末尾的3个点不算作单词

如果value=”hello world santa“,则输出"hello world ..."

 {{ value|truncatewords:2 }}

8 safe

作用:出于安全考虑,Django的模板会对HTML标签、JS等语法标签进行自动转义,例如

value="<script>alert(123)</script>",模板变量{{ value }}会被渲染成<script>alert(123)</script>交给浏览器后会被解析成普通字符”<script>alert(123)</script>“,失去了js代码的语法意义,但如果我们就想让模板变量{{ value }}被渲染的结果又语法意义,那么就用到了过滤器safe

比如value='<a href="https://www.baidu.com">点我啊</a>',在被safe过滤器处理后就成为了真正的超链接,不加safe过滤器则会当做普通字符显示’<a href="https://www.baidu.com">点我啊</a>‘

{{ value|safe }}

其他过滤器(了解)

过滤器 描述 示例
upper 以大写方式输出 {{ user.name | upper }}
add 给value加上一个数值 {{ user.age | add:”5” }}
addslashes 单引号加上转义号
capfirst 第一个字母大写 {{ ‘good’| capfirst }} 返回”Good”
center 输出指定长度的字符串,把变量居中 {{ “abcd”| center:”50” }}
cut 删除指定字符串 {{ “You are not a Englishman” | cut:”not” }}
date 格式化日期
default 如果值不存在,则使用默认值代替 {{ value | default:”(N/A)” }}
default_if_none 如果值为None, 则使用默认值代替
dictsort 按某字段排序,变量必须是一个dictionary {% for moment in moments | dictsort:”id” %}
dictsortreversed 按某字段倒序排序,变量必须是dictionary
divisibleby 判断是否可以被数字整除 {{ 224 | divisibleby:2 }} 返回 True
escape 按HTML转义,比如将”<”转换为”&lt”
filesizeformat 增加数字的可读性,转换结果为13KB,89MB,3Bytes等 {{ 1024 | filesizeformat }} 返回 1.0KB
first 返回列表的第1个元素,变量必须是一个列表
floatformat 转换为指定精度的小数,默认保留1位小数 {{ 3.1415926 | floatformat:3 }} 返回 3.142 四舍五入
get_digit 从个位数开始截取指定位置的数字 {{ 123456 | get_digit:’1’}}
join 用指定分隔符连接列表 {{ [‘abc’,’45’] | join:’’ }} 返回 abc45
length 返回列表中元素的个数或字符串长度
length_is 检查列表,字符串长度是否符合指定的值 {{ ‘hello’| length_is:’3’ }}
linebreaks 用或 标签包裹变量 {{ “Hi\n\nDavid”|linebreaks }} 返回HiDavid
linebreaksbr 用 标签代替换行符
linenumbers 为变量中的每一行加上行号
ljust 输出指定长度的字符串,变量左对齐 {{‘ab’|ljust:5}}返回 ‘ab ’
lower 字符串变小写
make_list 将字符串转换为列表
pluralize 根据数字确定是否输出英文复数符号
random 返回列表的随机一项
removetags 删除字符串中指定的HTML标记 {{value | removetags: “h1 h2”}}
rjust 输出指定长度的字符串,变量右对齐
slice 切片操作, 返回列表 {{[3,9,1] | slice:’:2’}} 返回 [3,9] {{ 'asdikfjhihgie' | slice:':5' }} 返回 ‘asdik’
slugify 在字符串中留下减号和下划线,其它符号删除,空格用减号替换 {{ '5-2=3and5 2=3' | slugify }} 返回 5-23and5-23
stringformat 字符串格式化,语法同python
time 返回日期的时间部分
timesince 以“到现在为止过了多长时间”显示时间变量 结果可能为 45days, 3 hours
timeuntil 以“从现在开始到时间变量”还有多长时间显示时间变量
title 每个单词首字母大写
truncatewords 将字符串转换为省略表达方式 {{ 'This is a pen' | truncatewords:2 }}返回``This is ...
truncatewords_html 同上,但保留其中的HTML标签 {{ 'This is a pen' | truncatewords:2 }}返回``This is ...
urlencode 将字符串中的特殊字符转换为url兼容表达方式 {{ ‘http://www.aaa.com/foo?a=b&b=c’ | urlencode}}
urlize 将变量字符串中的url由纯文本变为链接
wordcount 返回变量字符串中的单词数
yesno 将布尔变量转换为字符串yes, no 或maybe {{ True | yesno }}{{ False | yesno }}{{ None | yesno }} ``返回 ``yes``no ``maybe

模板语法之标签

逻辑相关

标签是为了在模板中完成一些特殊功能,语法为{% 标签名 %},一些标签还需要搭配结束标签 {% endtag %}

常用标签之for标签

1 遍历每一个元素

{% for person in person_list %}
<p>{{ person.name }}</p>
{% endfor %}

2 遍历一个字典

{% for key,val in dic.items %}
<p>{{ key }}:{{ val }}</p>
{% endfor %}

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

forloop.counter            当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是第一次循环则返回True,否则返回False
forloop.last 当前循环是最后一次循环则返回True,否则返回False
forloop.parentloop 本层循环的外层循环

5 for标签可以带有一个可选的{% empty %} 从句,在变量person_list为空或者没有被找到时,则执行empty子句

{% for person in person_list %}
<p>{{ person.name }}</p> {% empty %}
<p>sorry,no person here</p>
{% endfor %}

常用标签之if标签

1、注意:
{% if 条件 %}条件为真时if的子句才会生效,条件也可以是一个变量,if会对变量进行求值,在变量值为空、或者视图没有为其传值的情况下均为False 2、具体语法
{% if num > 100 or num < 0 %}
<p>无效</p>
{% elif num > 80 and num < 100 %}
<p>优秀</p>
{% else %}
<p>凑活吧</p>
{% endif %} 3、if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

常用标签之with标签

# with标签用来为一个复杂的变量名起别名,如果变量的值来自于数据库,在起别名后只需要使用别名即可,无需每次都向数据库发送请求来重新获取变量的值
{% with li.1.upper as v %}
{{ v }}
{% endwith %}

自定义过滤器和标签

当内置的过滤器或标签无法满足我们需求时,我们可以自定义

1 在应用名下新建一个名字必须为templatetags的文件夹(文件夹名只能是templatetags)

2 在templatetags新建任意.py文件,如my_tags.py,在该文件中自定义过滤器或标签

from django.template import Library
register = Library() # 注意变量名必须为register,不可改变 #1、自定义过滤器
@register.filter(name='my_filter')
def my_multi_filter(v1 ,v2): # 自定义的过滤器只能定义最多两个参数,针对{{ value1 | filter_multi:value2 }},参数传递为v1=value1,v2=value2
return v1 * v2
@register.filter(name='my_filter') # 相当于更改了函数名,使用时,使用新的函数名 #2、自定义标签
和自定义filter类似,区别:接收的参数更灵活,能接收万能参数
@register.simple_tag(name='my_tag')
def my_multi_tag(v1, v2, v3): # 自定义的标签可以定义多个参数
return '%s?%s?%s?'%(v1, v2, v3) #3、自定义inclusion_tag
@register.inclusion_tag('demo.html',name='my_inclu')
def index(n):
li = []
for i in range(n):
li.append(i)
#将列表传递给demo.html
return {'li': li}

自定义过滤器或标签必须重新启动django方可生效

自定义过滤或标签的使用

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <!--必须先加载存有自定义过滤器和标签的文件-->
{% load my_tags %} <!--salary的值为10,经过滤器my_multi_filter的处理结果为120-->
自定义过滤器的使用
{{ salary|my_filter:12 }} 自定义标签的使用
{% my_tag 1 2 3 'hello baby' %} 自定义inclusion_tag的使用
{% my_inclu 5 %}

对比自定义标签与自定义过滤器

#1、自定义过滤器只能传两个参数,而自定义标签却可以传多个参数

#2、过滤器可以用于if判断,而标签不能
{% if salary|my_multi_filter:12 > 200 %}
<p>优秀</p>
{% else %}
<p>垃圾</p>
{% endif %}

模板的继承和导入

在实际开发中,模板文件彼此之间可能会有大量冗余代码,为此django提供了专门的语法来解决这个问题,主要围绕三种标签的使用:include标签、extends标签、block标签

模板的导入之include标签

作用:在一个模板文件中,引入/重用另外一个模板文件的内容,

{% include '模版名称m.html' %}

模板的继承/派生之extends标签,block标签

当某一个页面大部分区域都是公用的,那这个页面就可以作为模板页面

当别人继承这个页面后,要修改对应的区域

先在模板页面上通过block实现划定区域

{% block content %}
模板页面内容
{% endblock %}

子页面中先导入真个模板

{% extends '模板页面.html'%}
修改特定的区域 通过实现划定好的区域名称
{% block content %}
子页面内容
{% endblock %}

通常情况下,模板页面应该起码有三块区域

{% block css %}
模板页面内容
{% endblock %}
{% block content %}
模板页面内容
{% endblock %}
{% block js %}
模板页面内容
{% endblock %}

模板的block块越多 可扩展性越高

还支持子页面调用父页面对应区域的内容 并且可以无限次调用

      {{ block.super }}

自定义char

from django.db.models import Field

class MyCharField(Field):
def __init__(self,max_length,*args,**kwargs):
self.max_length = max_length #拦截一个父类的方法 操作完之后 利用super调用父类的方法
super().__init__(max_length=max_length,*args,**kwargs) def db_type(self, connection):
return 'char(%s)'%self.max_length class Movie(models.Model):
textField = MyCharField(max_length=32)

特殊参数choices

1、定义字段时,指定参数choices

2、choices的值为元组套元组(事先定义好,一般在该表类中定义该字段之前定义)

3、每一个元组存放两个元素,形成一种对应关系

4、往数据库中存值时,该字段的值存为元组第一个元素即可

5、通过方式对象.get_字段名_display()获取对应的元组第二个元素值,当没有对应关系时,返回的是它本身

		class Userinfo(models.Model):
username = models.CharField(max_length=32)
gender_choices = (
(1,'男'),
(2,'女'),
(3,'其他'),
)
gender = models.IntegerField(choices=gender_choices)
# 该字段还是存数字 并且可以匹配关系之外的数字
record_choices = (('checked', "已签到"),
('vacate', "请假"),
('late', "迟到"),
('noshow', "缺勤"),
('leave_early', "早退"),
)
record = models.CharField("上课纪录", choices=record_choices, default="checked", max_length=64) user_obj = models.Userinfo.objects.get(pk=1)
print(user_obj.username)
print(user_obj.gender)
# 针对choices参数字段 取值的时候 get_xxx_display()
print(user_obj.get_gender_display())
# 针对没有注释信息的数据 get_xxx_display()获取到的还是数字本身
user_obj = models.Userinfo.objects.get(pk=4)
print(user_obj.gender)
print(user_obj.get_gender_display())

Django的templates(模板)的更多相关文章

  1. python - django 解决 templates 模板语言语法冲突

    # 在使用某个框架时发现语法与Django的模板语法冲突了,于是找到解决方案: {% verbatim %} // 被 verbatim 包裹起来的地方是不会被 django 渲染的 {% endve ...

  2. Django之templates模板

    模板渲染: 官方文档:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#std:templatetag-for 模板渲染两种 ...

  3. django templates模板

    Django templates模板 HTML代码可以被直接硬编码在views视图代码中,虽然这样很容易看出视图是怎么工作的,但直接将HTML硬编码到视图里却并不是一个好主意. 让我们来看一下为什么: ...

  4. django学习-6.模板templates

    1.前言 首先,我们要知道html是一门静态语言,里面没法传一些动态参数,也就是一个写死的html页面. 那么,如果我们想实现在一个html页面里传入不同的参数对应的参数值,这就可以用django框架 ...

  5. python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器

    python3.5 manage.py runserver python Django教程 之模板渲染.循环.条件判断.常用的标签.过滤器 一.Django模板渲染模板 1. 创建一个 zqxt_tm ...

  6. python测试开发django-2.templates模板与html页

    前言 Django 中的视图的概念是一类具有相同功能和模板的网页的集合.通俗一点来说,就是你平常打开浏览器,看到浏览器窗口展示出来的页面内容,那就是视图.前面一章通过浏览器访问http://127.0 ...

  7. Django(框架、模板)

    day65 参考:https://www.cnblogs.com/liwenzhou/p/8296964.html Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间 ...

  8. django配置templates、static、media和连接mysql数据库

    1.模板文件 # =======templates配置======= if os.path.exists(os.path.join(BASE_DIR, 'templates')) is False: ...

  9. Django框架 之 模板语言

    Django框架 之 模板语言 浏览目录 标签 过滤器 一.标签 Tags 1.普通变量 普通变量用{{ }} 变量名由数字.字母.下划线组成 点.在模板语言中用来获取对象相应的属性值 示例: 1 2 ...

随机推荐

  1. JZOJ5915 [2018NOIP模拟] 明日之星(广义后缀自动机,线段树)

    题目描述 给定一棵树,每个节点有一个权值 \(a_i\) 和一个字符串 \(s_i\). q组询问,每次询问一个字符串 S 和两个节点x,y: 求x到y路径上每个节点的字符串在 S 中出现的次数乘上各 ...

  2. [WC2018]即时战略(LCT,splay上二分)

    [UOJ题面]http://uoj.ac/problem/349 一道非常好的与数据结构有关的交互题. 首先先看部分分做法, 一上来我们肯定得钦定一个 \(explore\) 的顺序,直接随机就好. ...

  3. LeetCode练题——88. Merge Sorted Array

    1.题目 88. Merge Sorted Array——Easy Given two sorted integer arrays nums1 and nums2, merge nums2 into  ...

  4. PHP将json或对象转成数组

    今天老大突然给了我一个小任务,给我一个txt文件,里边是很多的json字串,要求将这些字串转换成php中的数组: 于是开足火力,用了将进5分钟的时间完成了任务,代码如下: $jsonStr = fil ...

  5. opencv python:模糊操作

    均值模糊 中值模糊 自定义模糊 模糊操作的基本原理 基于离散卷积 定义好每个卷积核 不同卷积核得到不同的卷积效果 模糊是卷积的一种表象 blur cv2.blur(image, (1, 3)) 第二个 ...

  6. numpy.eye() 生成对角矩阵

    numpy.eye(N,M=None, k=0, dtype=<type 'float'>) 关注第一个第三个参数就行了 第一个参数:输出方阵(行数=列数)的规模,即行数或列数 第三个参数 ...

  7. php学习函数如何执行的

    入口栈abc(4)--------abc(4)------abc(3)-----abc(2)再返回上一层栈,执行完后返回上一层.输出$n=2-------$n=2-------$n=3

  8. idea设置代码提示忽略大小写

  9. Hibernate笔记二

    1.延迟加载(懒加载) 概念 需要用到该数据的时候才要加载 种类 类的延迟加载 案例 说明:注意:使用的是Load方法 1.  执行22行代码的时候,不发出sql语句,说明类的延迟加载和主键没有关系 ...

  10. npm安装包时的几种模式

    本文原文地址:https://www.limitcode.com/detail/59a15b1a69e95702e0780249.html 回顾 npm install 命令 最近在写Node程序的时 ...