小谈Django中的模板系统

Django的模板系统

常用语法

Django模板中只需要记住两种特殊符号 : {{ }}和{% %} ;

{{ }}表示变量 , 在模板渲染的时候替换成值 ; {% %} -- "标签"( tag ) : 表示逻辑相关的操作 ;

变量

注意 :

  • 变量中都是通过.来取相关的内容 , 模板语法中没有[ ]和( ) ;
  • 取索引 : 直接 .数字, 如{{ lst.0 }} ; 如果超出索引范围就是不显示 , 不报错 ; 但是索引值为负数时会报错 , 如{{ lst.-1 }}
  • 字典取值 : 直接.键 , 如{{ dic.name }} ; 字典取键 : 直接.keys , 如{{ dic.keys }}
  • 对象取属性或方法 : 都是直接.属性/方法 ,如{{ obj.name }} 或者 {{ obj.run }} ; 调用对象的方法时 , 只能调用不带参数的方法 ;
  • 当模板系统遇到一个.时 , 会按照如下的顺序取查询 ( 如类和字典或者列表重名时 ) :
    • 在字典中查询
    • 属性或者方法中查询
    • 数字索引中查询

过滤器 - Filters

Filters翻译过来叫过滤器 , 用来修改变量的显示结果 ;

语法: {{ value | filter_name:参数 }} ; 参数最多只有一个(可以没有), 并且 : 两边没有空格!!!!!

default

default的意思:xxx是变量,如果没有这个变量或者变量为空(空列表,空字典,None都是空)时,用default的值;如果变量本身有值,就显示自己的值 ;

{{ xxx|default:'没有传参' }}

filesizeformat

这个过滤器没有参数,filesize:'文件大小',比如定义filesize=100,加上这个过滤器就显示100bytes,如果数值较大会自动更新为合适的单位,最大显示到PB ;

{{ filesize|filesizeformat }}

add

  1. 加法 : 参数可以是正数也可以是负数;参数写成字符串('-11')也可以,会硬转化成整数再去加 ;

    {{ age|add:-11 }}
    
  2. 拼接 : 变量和参数都是字符串,就是字符串的拼接;如果变量和参数都是列表就是列表的拼接 ;

    {{ string|add:' is dsb' }}
    

lower

所有字母都变成小写 ;

{{ string|lower }}

upper

所有字母都变成大写 ;

{{ string|upper }}

length

显示长度,这里:列表加上自己再显示其长度,就显示hobby_list长度的2倍 ;

{{ hobby_list|add:hobby_list | length }}

slice

切片,''中写的内容和Python中[]里面写的内容相同 ;

{{ hobby_list|slice:'::2' }}

first

取第一个元素 ;

{{ hobby_list|first }}

last

取最后一个元素 ;

{{ string|last }}

join

将列表中的元素按照什么拼接 ;

{{ hobby_list|join:'-' }}

truncatechars

显示多少字符长度的内容,最后显示的...也计入10之中,也就是说如果参数是3,那就显示三个点了 ;

{{ long|truncatechars:10 }}

truncatewords

显示多少单词长度的内容,按空格分 ;

{{ long|truncatewords:10 }}

date

日期时间格式化 ;

  1. 这个日期时间格式化之后显示的就是按照这个格式(如:'2017-01-01 12:12:12') ;

    {{ now|date:'Y-m-d H:i:s' }}
    
  2. 如果在settings.py中把USE_L10N = False 再加一行:DATETIME_FORMAT = 'Y-m-d H:i:s' 这样的效果和格式化之后的一样,如果前端页面需要格式化的变量比较多时可以选择这个:这里还可以只格式化日期或者只格式化时间:DATE_FORMAT和TIME_FORMAT ;

  3. 如果不用格式化,只修改settings.py中的语言和时区就是显示成'2017年01月01日 12:12:12'

safe

Django的模板中会对HTML标签和JS等语法标签进行自动转义 , 但是有时候我们不希望这些HTML元素被转义 , 这里就是使用safe

value = '<a href="http://www.baidu.com">百度</a>'
{{ value|safe }}

模板的标签

用{% %}表示的就是标签

for循环

# {{ forloop.counter0 }} 0,1,2 从0开始
# {{ forloop.revcounter }} 3,2,1
# {{ forloop.revcounter0 }} 2,1,0 到0结束
# {{ forloop.first }} 第一个是True,其余都是false ; lase反之
# {{ forloop.parentloop }} 本层循环的外层循环的变量
# {% empty %} 有数据显示数据,没有数据时可以自定义显示内容
<ui>
    {% for hobby in hobby_list %}
        <li>{{ forloop.counter }} {{ hobby }}</li>
    {% empty %}
    	<li>没有数据</li>
    {% endfor %}
</ui>

if...else

if...else : 有些情况并不支持 , 这里举例说明

不支持算数运算
#  1+1>1,无法完成,要借助于过滤器
{% if 1|add:1 > 1 %}
	真
{% edif %}
不支持连续判断
# 不支持连续判断
# 说明: 10>5>1 在Python中显示为True(10>5:True,5>1:True;两个True取交集所以成立);而模板语法类似于JS(10>5为True,True>1就是False)

with

相当于取别名 , 只能在with范围内使用 : 可以将一些临时用的比较频繁 , 名称又比较复杂的变量用with取别名 ;

{% with ... as ... %} # 这行也可以写成 : {% with ...=... %}
    ...
{% endwith %}

csrf_token

这个标签可以跨站请求伪造保护 ;

在前端页面的form表单里面写上{% csrf_token %} , 在form表单中有一个隐藏的input标签 name='csrfmiddlewaretoken' value是一直在变的

母版和继承

母版

提取多个页面公共部分放在一个母版中 , 定义上多个block块 , 让子页面重新复写

继承

  1. {% extends '母板的名字' %} ;
  2. 重写block块 ;
# 母版 --> index.html
{% block content %}
	可以被替换的内容
{% endblock %}

# 继承页面中
{% extends 'index.html' %}

{% block content %}
	替换成自己的内容
{% endblock %}

注意 :

  1. {% extends '母板的名字' %} 模板名字的引号必须加上 , 不加引号会被当作变量 ;
  2. {% extends '模板的名字' %} 的上面不要写内容 ;
  3. 要替换母版的内容都放在block块中 ;
  4. 可以定义多个block块 ;

组件

可以将常用的页面内容( 一小段代码段 ) , 如导航条,页面信息等组件保存在单独的html文件中 , 然后在需要使用的地方按如下语法导入即可 .

{% include 'nav.html' %}

注意 :

  1. 导入组件时 , 如果组件需要导入bootstrap , 需要在页面另行导入 ;
  2. 母版如果导入了组件 , 继承母版的页面不用再另行导入组件 ;

用上{% load static %} 就不用担心settings.py中的STATIC_URL = '/static/'修改名字了 ;

{% load static %}
# 页面中导入css,js的上面写上{% load static %},导入时可以这样写
# {% static 'css/js等静态文件的相对路径' %} 如下面:
<link rel='stylesheet' href="{% static 'plugins/bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">

{% get_static_prefix %} 就是获取settings.py中的STATIC_URL = '/static/' 的'/static/' , 如果需要单独使用一次STATIC_URL的值 , 可以用这个 ,了解即可 .

posted @ 2020-10-12 19:51  richard_A  阅读(84)  评论(0编辑  收藏  举报