Django的templates(模板)

目录

  • Django的templates(模板)
  • 模板传值
  • 模板过滤器
  • 模板语法之标签
    • 常用标签之for标签
    • 常用标签之if标签
    • 常用标签之with标签
  • 自定义过滤器和标签
  • 模板的继承和导入
    • 模板的导入之include标签
    • 模板的继承/派生之extends标签,block标签

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 }}

原文地址:https://www.cnblogs.com/kai-/p/12163326.html

时间: 2024-10-01 02:11:07

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

django使用templates模板

Django中Settings中Templates的路径设置 ## mysite/mysite/settings.py ## mysite是项目名 TEMPLATES = [     {         'BACKEND': 'django.template.backends.django.DjangoTemplates',         'DIRS': [os.path.join(BASE_DIR, 'templates')],           # templates         '

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

python3.5 manage.py runserver python Django教程 之模板渲染.循环.条件判断.常用的标签.过滤器 一.Django模板渲染模板 注: 本节代码是基于 Django 1.8,但 Django 1.4 - Djagno 1.9 操作流程也是一样的. 后文给出示例代码可以在 Django 1.4.x 到 Django 1.9.x 上运行. 不过还是强调一点,一点要动手敲代码!不要偷懒哦,动手才能学到真东西. 1. 创建一个 zqxt_tmpl 项目,和一个 名

Python笔记(五)--Django中使用模板

使用Django开发网站时,如果不使用模板,那么将会很不合理.因为我们所有的html代码都需要被硬编码到我们的Python代码中.我们新建一个工程,然后再在新建一个应用程序,并在其中的views.py文件中添加如下代码: 1 #coding=UTF-8 2 from django.http.response import HttpResponse, Http404 3 import datetime 4 5 def hours_ahead(request,offset): 6 try: 7 of

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

前言 Django 中的视图的概念是一类具有相同功能和模板的网页的集合.通俗一点来说,就是你平常打开浏览器,看到浏览器窗口展示出来的页面内容,那就是视图. 前面一章通过浏览器访问http://127.0.0.1:8000能在页面上展示出hello world的纯文本内容,通常我们打开浏览器页面,展示的是一个html页面,本篇讲下如何打开html页面. 新建应用 上一篇通过"django-admin startproject helloworld"是创建项目,一个项目下可以有多个应用(a

django-2.templates模板与html页

前言 Django 中的视图的概念是一类具有相同功能和模板的网页的集合.通俗一点来说,就是你平常打开浏览器,看到浏览器窗口展示出来的页面内容,那就是视图.前面一章通过浏览器访问http://127.0.0.1:8000能在页面上展示出hello world的纯文本内容,通常我们打开浏览器页面,展示的是一个html页面,本篇讲下如何打开html页面. 新建应用 上一篇通过"django-admin startproject helloworld"是创建项目,一个项目下可以有多个应用(ap

templates模板

为什么用templates? views.py视图函数是用来写Python代码的,HTML可以被直接硬编码在views.py之中. 对页面设计进行的任何改变都必须对 Python views.py中的代码进行相应的修改. 站点设计的修改往往比底层 Python 代码的修改要频繁得多,因此如果可以在不进行 Python 代码修改的情况下变更设计,那将会方便得多. Python 代码编写和 HTML 设计是两项不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员(甚至不同部门)来完成. 设计

django之定义模板语法08({{ string | truncatewords:&#39;2&#39; }})

#index页面代码: <html> <head> <title>DOcument</title> </head> <body> <h1>{{user}}</h1> </br> </br> <h1>过滤器</h1> <p>{{ string | truncatewords:'2' }}</p> //显示前2个字(非字母) </body

django学习之模板系统

django模板系统学习笔记之for 在for标签里面,有以下知识点: forloop.counter forloop.counter0 forloop.first forloop.last forloop.revcounter forloop.revcounter0 froloop.parentloop empty 下面我们举例学习: 首先到我们的工程目录下,敲入: python manage.py shell # forloop.counter from django.template im

Django框架之模板

Django框架之模板层 什么是模板 需要返回给浏览器的html文件 Django的模板 = HTML代码 + 模板语言 模板语言 有与我们直接返回html页面的话,那他只是一个静态页面无法实现前后端数据交互,那么我们就需要经过页面渲染,让静态文件呈现出动态页面的效果. 模板语言的变量 如果我们需要将后端的数据传递到前端页面渲染,就需要用到模板语言中的变量 用法:通过{{}}来获取后端传递过来的数据 变量支持的数据类型: int float str dict list tuple set boo