1.模板层-变量和标签
能够传递到Django模板中的数据类型:
1.str 字符串
2.Int 整形
3.List 数组
4.Tuple 元组
5.Dict 字典
6.Func 方法
7.Obj 类的实例化对象。
在模板中使用的变量的语法:
- {{变量名}}
- {{变量名.index}} #索引
- {{变量名.key}} #获取字典对应key的value
- {{对象.方法}} #直接获取对象对应的方法.
- {{函数名}} #直接调用某个函数
通过在模板层直接使用这种方式来暂时占用我们即将要使用的变量信息,即可实现在视图层将数据传输到模板层,并填充成httpResponse返回给客户端。这也意味着Django的模板是十分灵活的,能够应对大多数开发环境和实际应用的环境。
模板标签
对于标签的概念,类似于{{}}就是python的一种变量。但是这种标签只能使用一些最简单的常量标签。
因此,如果要在模板中使用一些前端的循环、选择、控制结构,可以使用一些标签来实现。
标签语法:
{% 标签 %}
...
{% 结束标签 %}
例如:
{% if 条件表达式1 %}
...
{% elif 条件表达式2 %}
...
{% elif 条件表达式3 %}
...
{% endif %}
需要注意的是,if条件表达式里可以使用的运算符为==,!=,<,>,<=,>=,in,not in,is,is not,not ,and,or。而且在if标签中使用括号是一种无效的语法,如果需要使用括号来指示优先级的话,应当采用嵌套的if标记来实现。
对于视图层的函数定义,可以使用request.GET中的x的值来给dic中的x赋值。随后在模板中,通过定义if else语句来实现判断。
在这里,利用所学知识编写了一个简单的计算器,该计算器能够保存当前页面的值和操作状态。
在视图层,代码如下:
<html>
<head>
<title>计算器</title>
</head>
<body>
<table>
<form action="./" method="post">
<tr>
<td>{{value1}}</td>
<td>
<input type="text" name="num1" value="{{num1}}">
</td>
</tr>
<tr>
<td>
{{op}}
</td>
<td>
<select name="flag">
<option value="1" {{f1}}>+</option>
<option value="2" {{f2}}>-</option>
<option value="3" {{f3}}>*</option>
<option value="4" {{f4}}>÷</option>
</select>
</td>
</tr>
<tr>
<td>
{{value2}}
</td>
<td>
<input type="text" name="num2" value="{{num2}}">
</td>
</tr>
<tr>
<td>
{{value3}}
</td>
<td>
<input type="text" name="res" value="{{res}}" disabled="disabled">
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="计算答案" name="submit">
</td>
</tr>
</form>
</table>
</body>
</html>
而在后台的代码实现中,使用的代码如下:
通过这种方式,在urls.py中定义基本的路径,打开浏览器能够实现最基础的计算器的功能。
同样的,使用for循环在视图层进行控制时,可以在模板曾定义如下的代码:
{% for name in lst%}
{% if forloop.first %}
&&&&&&&
{% endif %}
<p>{{forloop.counter}}.{{name}}</p>
{% if forloop.last %}
@@@@@@@
{% endif %}
{% empty %}
当前没数据
{% endfor %}
在视图层定义的代码为:
forloop是django中为for循环内建的变量。其中forloop.first意味着第一次循环,forloop.last意味着最后一次循环,返回的内容都是bool型,因此,可以和if进行嵌套使用。
forloop.counter是对循环次数进行计数,主要作用是从1开始计数。
使用forloop.counter0是对循环次数进行计数,主要作用是从0开始计数。
2.模板层-过滤器和继承
模板层过滤器的定义:
在变量输出时对变量的值进行处理
模板层的作用:
可以通过使用过滤器来改变变量的输出显示
语法:
{{变量|过滤器1:’参数值1’|过滤器2:参数值2 …}}
常用的过滤器:
lower 将字符串全部改为小写
upper 将字符串全部改为大写
safe 默认不对变量内的字符串进行html转义(相当于关闭xss攻击防护,显示标签)
add:”n” 将value的值增加n
truncatechars:”n” 如果字符串字符多于指定的字符数量,那么会被截断。
关于模板的继承
模板的继承主要用于让多个页面继承相同的页面内容,避免重复代码的冗余开发。
通过多个页面复用相同的框架内容,实现动态内容的切换效果的同时,避免的相同组件的反复loading造成的开发工作的时间浪费。
模板继承可以使父模板的内容重用,子模版可以直接继承父模板的全部内容,并可以覆盖父模板中的相应的块。
语法-父模板中:
1.定义父模板中的块block标签
2.标识出那些在子模块中是允许被修改的。(中间部分允许被修改)
3.Block标签,在父模块中定义,可以在子模版中进行覆盖。
继承模板使用extends标签(写在模板文件的第一行)
例如:
{% extends ‘bash.html’ %}
该标签是没有结束标签的
因此,在此处,我们尝试定义一个父模板,命名为base.html
并在我们先前定义的calc.html中增加我们的继承语句。
其中
{% extends ‘base.html’%}语句的主要作用为增加对父页面的继承。
{% block info%}则为对父页面中的block info块的内容进行重写。
如果选择对父模板进行重写,则按照重写的效果进行显示,如果不对父模板进行重写,那么按照父模板的效果进行显示。
也就是需要被继承的父模板信息将会原封不动的在计算器页面中出现。
效果图如图:
在2.x版本中,但是需要注意的是,如果继承模板时,服务器端的动态内容是无法继承的。但是我在3.3版本中进行了测试,是能够继承的。因此具体情况还需要具体的进行分析。
3.url反向解析
目前来说,url的用途和使用范围如下:
1.模板中,在模板层,可以使用a标签的href属性来指定一个超链接。
2.表单中,form的action属性可以指定一个超链接用于提交数据。
3.视图函数中,可以使用HttpResponseRedirect来指定一个302跳转,使客户端获得一个新的超链接指向。
对于绝对地址和相对地址而言,在编程中也有多种描述,每种描述所代表的含义也各不相同。
在模板层中,定义了一套h5的页面来表述各种地址点击后跳转的差异化问题。具体的差异可以通过实践来进一步证实和测试。
Url的反向解析是指在视图层的视图函数定义时,使用path函数的第三个参数name来定义一个路由规则的别名,进行动态的查找对应的地址信息。
在urls.py中,定义路由规则,给path参数提供第三个参数来实现路径的别名定义。
通过定义别名,相当于就把展示页面和输出结构的字符串和url进行了绑定。
在模板层,即可使用
{% url ‘别名’%} 来实现跳转路径的指定,无需考虑绝对路径和相对路径的具体编写模式。
如果该页面存在参数,则可以通过
{% url ‘别名’ ‘参数值1’ ‘参数值2’%}
实现url的动态拼接。
因此,为了实现页面1-N的动态跳转排列展示,可以通过配合模板层的for循环和url反向解析规则,构建跳转参数。
在路由urls.py中,定义规则:
在视图层中,定义字典信息。并将数据动态更新到模板层中。
在模板层中,使用url标签和for循环,循环控制页面的输出信息和特定的经过拼接的url路径,通过django提供的url反向解析实现页面跳转的简单化。
最终实现的效果图如下:
通过反向解析,能够实现即使项目路径规则出现了变化,但是由于存在反向解析,所以模板层的地址将会动态的随着路由规则的信息的变化而变化,无需在模板层进行跳转路径的修改。
如果需要在视图层查找对应的别名所对应的url地址。那么需要载入python模板
from django.urls import reverse;
通过
reverse(别名,args=参数列表, kwargs={})
来实现reverse方法进行url反向解析。