Django之模板语法、模板传/取值、过滤器、标签、继承、for/if

模板语法

	{{}}  变量相关
	{%%}  逻辑相关

自动序号

{{ forloop.counter }}

模板层之模板传值

python基本数据类型全部支持传递给html文件
	函数
	类
		函数和对象会自动加括号
		# 模板语法不支持传参
	对象
		后端给html文件传递数据的两种方式
		1.指名道姓
			return render(request,'index.html',{'n':n,'f':f})

		2.locals()  # 会将当前名称空间中所有的变量名全部传递给html页面
			return render(request,'index.html',locals())  
	
		html页面上 如何获取到后端传递过来的数据 
			{{ 变量名 }}

模板层之模板取值

取值
		django模板语法取值 只有一种操作方式  句点符 .
		点索引
		点键
		
		<p>{{ l.2 }}</p>
		<p>{{ d.username }}</p>
		<p>{{ d.password }}</p>
		<p>{{ d.hobby.1.username.1 }}</p>

模板语法之过滤器

在Django的模板语言中,通过使用 过滤器 来改变变量的显示。

过滤器的语法: {{ value|filter_name:参数 }}

使用管道符"|"来应用过滤器。

例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写。

注意事项:

	1.过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
	2.过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
	3.过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}
	4.'|'左右没有空格没有空格没有空格
	|length			 # 返回值的长度,作用于字符串和列表
	|add  			 # 加法运算
	|default		 # 如果一个变量是false或者为空,使用给定的默认值。 否则,使用变量的值
	|truncatechars	  # 截取字符串的长度。三个点也算,所有如果要截取5个长度,应该5+3=8的长度
	|truncatewords	  # 截取单词、词语,以空格为标识
	|filesizeformat	  # 把文件大小转换成人能看懂的。KB,GB
	|slice			 # 切片操作
	|date			 # 日期格式化
	|safe			 # 取消转义操作

使用案例:

	<p>过滤器  |左边的会当做过滤器的第一个参数 过滤器名右边的会当做过滤器的第二个参数</p>
	<p>求数据长度:{{ s|length }}</p>
	<p>加法运算:{{ n|add:10 }}、{{ s|add:13132 }}、{{ s|add:'DSB' }}</p>
	<p>默认值(判断值是否为空):{{ b|default:'这个b布尔值是True' }}、{{ ff|default:'这个ff布尔值是Flase' }}</p>
	<p>截取字符(截取5个字符 三个点也算):{{ s|truncatechars:8 }}</p>
	<p>截取单词(截取8个单词 三个点不算):{{ ss|truncatewords:8 }}、{{ sss|truncatewords:4 }}</p>
	<p>文件大小:{{ file_size|filesizeformat }}</p>
	<p>切片操作:{{ s|slice:'0:2' }}、{{ s|slice:"0:8:2" }}</p>
	<p>日期格式化:{{ ddd|date:'Y年/m月/d日' }}</p>
	<p>转义:{{ res|safe }}、{{ res1 }}、后端直接标识安全:{{ res2 }}</p>

前后端取消转义:

前端
		|safe
	后端
		from django.utils.safestring import mark_safe
		mark_safe('<h1>安全滴</h1>')
总结:前端代码不一定非要在前端页面写,可以在后端写好传递给前端页面使用
这样的话 你就可以利用到后端更加多的逻辑语法

模板语法之标签

模板语法之标签  (逻辑相关)

{% for foo in l %}  <!--l = [1,2,3,4,5,6]-->
	{% if forloop.first %}
		<p>这是我的第一次</p>
	{% elif forloop.last %}
		<p>这是最后一次了啊~</p>
	{% else %}
		<p>{{ foo }}</p>
	{% endif %}
	{% empty %}
    <p>for循环的对象内部没有值</p>
{% endfor %}

自定义过滤器

自定义过滤器 标签 inclusion_tag
先完成以下前期准备工作
	1.在应用名下新建一个名字必须叫templatetags文件夹
	2.在该文件夹内新建一个任意名称的py文件(eg:mytag)
	3.在该文件内 必须先写以下两句代码
		from django.template import Library
		
		register = Library()
		
	# 自定义过滤器
	@register.filter(name='my_sum')
	def index(a,b):
		return a + b

第一步定义:

第二步html页面使用方式:

<p>自定义过滤器的使用</p>
	{% load mytag %}
	<p>{{ 10|my_sum:90 }}</p>

自定义标签

	# 自定义标签
	@register.simple_tag(name='my_baby')
	def xxx(a,b,c,d):
		return '%s?%s?%s?%s'%(a,b,c,d)

自定义标签的使用:

<p>自定义标签的使用</p>
	{% load mytag %}
	<p>{% my_baby 1 2 3 'hello world' %}</p>

总结:

<p>自定义的过滤器可以在逻辑语句中,而自定义的标签不可以</p>
	{% if 10|my_sum:100 %}
		<p>条件成立</p>
	{% endif %}

	{% if my_baby 1 2 3 4 %}
		<p>条件成立</p>
	{% endif %}
		
	<p>自定义inclusion_tag的使用</p>
	{% load mytag %}
	{% myin 5 %}
	# 总结 页面上使用他们 统一先导入
		{% load mytag %}

模板的继承

某一个页面大部分区域都是公用的 那这个页面就可以作为模板页面
	当别人继承这个页面之后 如何修改对应的区域

使用方法:

1.先在模板页面上通过block实现划定区域
	{% block content %}	
			模板页面内容
		{% endblock %}
2.子页面中先导入整个模板
	{% extends '模板页面.html'%}
		修改特定的区域  通过实现划定好的区域名称
		{% block content %}
			子页面内容
		{% endblock %}

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

	1.css部分
		{% block css %}	
			模板页面内容
		{% endblock %}
	2.内容部分
		{% block content %}	
			模板页面内容
		{% endblock %}
	3.JS部分
		{% block js %}	
			模板页面内容
		{% endblock %}
		
	# 模板的block块越多 可扩展性越高
	
	还支持子页面调用父页面对应区域的内容 并且可以无限次调用
		{{ block.super }}

模板的组件

可以将局部样式布局提前写好,然后哪里需要导哪里(不常用)

将html页面当做模块使用 哪里需要导哪里  这个html页面通常都不是完整的 只是一个局部样式
	{% include 'left.html' %}

for循环

普通for循环

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% endfor %}
</ul>

for循环可用的一些参数:

Variable Description
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是不是第一次循环(布尔值)
forloop.last 当前循环是不是最后一次循环(布尔值)
forloop.parentloop 本层循环的外层循环

for ... empty

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% empty %}
    <li>空空如也</li>
{% endfor %}
</ul>

if,elif,else判断

{% if user_list %}
  用户人数:{{ user_list|length }}
{% elif black_list %}
  黑名单数:{{ black_list|length }}
{% else %}
  没有用户
{% endif %}

也可以只有if和else

{% if user_list|length > 5 %}
  七座豪华SUV
{% else %}
    黄包车
{% endif %}

if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

with

定义一个中间变量,多用于给一个复杂的变量起别名。

注意等号左右不要加空格。

{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

{% with business.employees.count as total %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

模板语法注释

{# 注释内容 #}				//这样方式注释,前端浏览器检查看不见
<!--注释内容-->				//浏览器检查能看见
posted @ 2020-01-07 19:03  Jeff的技术栈  阅读(3221)  评论(0编辑  收藏  举报
回顶部