上一篇:Django之view视图处理【交互篇二】点击跳转
目录篇:Django之前后端交互篇目录 点击跳转
下一篇:Django之CSRF XSS原理解析【交互篇四】点击跳转
目录
- 各种模板渲染
- 后端进行render
- 前端进行渲染(字符渲染,列表渲染,字典渲染,IF判断渲染,if嵌套到for循环里面,forloop)
- 得到的结果
- 注意:数据类型取值和Python的区别
- HTML继承母版(全局extends, 局部include)
- extends
- include
各种模板渲染
简单理解:来说就是后端把html里面的特殊符号{{ }}内容替换成我们给的内容,又或者你可以理解成后端给一个变量给前端使用
更深入了解跳转:web框架的本质(socket,WSGI)https://blog.youkuaiyun.com/Burgess_zheng/article/details/86496202
后端进行render
def tem_render(request):
current_user = 'Burgess'
user_dict = {'k1': 'v1', 'k2': 'v2', }
user_list = ['xiaoming', 'xiaohong']
age = 18
return render(request, "render.html", {'current_user': current_user,
"age": age,
'user_list': user_list,
'user_dict': user_dict,
})
前端进行渲染(字符渲染,列表渲染,字典渲染,IF判断渲染,if嵌套到for循环里面,forloop)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--
前端变量:
current_user = 'Burgess'
user_dict = {'k1': 'v1', 'k2': 'v2', }
user_list = ['xiaoming', 'xiaohong']
age = 18
-->
<div>--------------------字符串-------------------</div>
<!--字符串取值(渲染)-->
<div>{{ current_user }}</div> <!--获取结果: Burgess -->
<div>{{ current_user.0 }}</div> <!-- 获取结果: B -->
<div>--------------------列表-------------------</div>
<!--列表根据下标直接取值(渲染) -->
<a>{{ user_list.0 }}</a> <!--获取结果: xiaoming -->
<a>{{ user_list.1 }}</a> <!--获取结果:xiaohong -->
<!--for循环列表取值 -->
<ul>
{% for row in user_list %}
<li>{{ row }}</li> <!--获取结果: row=xiaoming && row=xiaohong-->
<li>{{ row.0 }}</li> <!--如果是row=xiaoming 获取结果为字符: x -->
<li>{{ row.1 }}</li> <!--如果是row=xiaoming 获取结果为字符: i -->
{% endfor %}
</ul>
<div>--------------------字典-------------------</div>
<!-- 字典根据key直接取值 -->
<a>{{ user_dict.k1}}</a> <!--获取结果: v1 -->
<a>{{ user_dict.k2}}</a> <!-- 获取结果: v2 -->
<!-- for循环列表取值 -->
<ul>
<!--循环获取该字典的key -->
{% for row in user_dict %}
<li>{{ row }}</li> <!-- 获取结果为字典key: v1 && v2 -->
{% endfor %}
<!--循环获取该字典的key -->
{% for row in user_dict.keys %}
<li>{{ row }}</li> <!--获取结果为字典key: v1 && v2 -->
{% endfor %}
<!--循环获取该字典的value -->
{% for row in user_dict.values %}
<li>{{ row }}</li> <!-- 获取结果字典的value: k1 && k2-->
{% endfor %}
<!--循环获取该字典的key和value(元组形式)-->
{% for row in user_dict.items %}
<li>{{ row }}</li>
<!--获取结果为元祖包含key和value:row= ('k1', 'v1') && row= ('k2', 'v2') -->
{% endfor %}
<!--循环获取该字典的key和value(分别赋值)-->
{% for k,row in user_dict.items %}
<li>{{ k }}---{{ row }}</li>
<!-- 获取结果:k= k1 row=v1 && k= k2 row=v2 -->
{% endfor %}
</ul>
<div>--------------------if判断-------------------</div>
<!-- if判断 -->
{% if age %} <!--假如age 的value大于0 就证明是true -->
<a>有年龄</a>
{% if age > 16 %}
<a>老男人</a>
{% else %}
<a>小鲜肉</a>
{% endif %}
{% else %}
<a>无年龄</a>
{% endif %}
<div>--------------------IF嵌套到FOR循环里面-------------------</div>
<ul>
{% for row in user_list %}
{% if row == "xiaoming" %} <!--假如row==xiaoming-->
<li>{{ row }}</li> <!--row = xiaoming -->
{% endif %}
{% endfor %}
</ul>
<div>--------------------forloop参数-------------------</div>
<ul>
{% for row in user_list %}
<div>{{ forloop.counter }}</div>
<!--user_list=['xiaoming','xiaohong'] 所以是循环两次 {{ forloop.counter }}分别==1 && 2 -->
{% endfor %}
<!--
forloop.counter 记录循环次数(从1开始),获取当次循环次数作为标签内容
forloop.counter0 记录循环次数(从0开始),获取当次循环次数作为标签内容
forloop.revcounter 记录循环次数(次数最高到1),获取当次循环次数作为标签内容
forloop.revcounter0 记录循环次数(次数最高-1到0),获取当次循环次数作为标签
forloop.first,第一循环:标签内容True,其他标签内容False
forloop.last,最后一个循环:标签内容True,其他标签内容False
forloop.parentloop: for嵌套循环的时候, 获取父循环次数作为子循环标签的内容
forloop.parentloop后面 点. + 下面任意一个 获取选择的值做标签内容forloop.first,forloop.last,revcounter0 ,revcounter ,counter0 ,counter
-->
</ul>
</body>
</html>
得到的结果
注意:数据类型取值和Python的区别
通过模板HTML语言进行数据类型取值都是通过点
v=obj(id,name,....)
#对象取值方式:通过点如:v1.id
v={'id':1,'caption':'运维部'}
#字典取值方式:Python:v ["key"]、
#模板渲染通过点如:v.id
v= (1,2)
#元组取值方式:Python: v[下标]
#模板渲染:v.下标
v=[1,2]
#列表取值方式:Python:v[下标]
模板渲染:v.下
HTML继承母版(全局extends, 局部include)
实战Django之继承母版(extends, include): https://blog.youkuaiyun.com/Burgess_zheng/article/details/86548311
extends
继承全局母版
场景:多个模板的格式和部分标签相同的时候,继承相同的部分,不同的部分根据母版的block块进行替换内容母版(在不通用的位置进行block,这样继承人可以自定制内容,继承者只能继承1次):
master.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title> {% block title %} {% endblock %} <!--block:母版的块title:块名:继承该母版的模板可根据该块名替换该块内容--> </title> <link rel="stylesheet" href="/static/commons.css"/> <style> .pg-header{ height:48px; background-color: seashell; color: #eec84a; } </style> {% block css %} {% endblock %} <!--block:母版的块 css:块名:继承该母版的模板可根据该块名替换该块内容--> </head> <body> <div class="pg-header">Bugess</div> {% block content %} {% endblock %} <!--block:母版块content:块名:该块内容可被替换,模板继承以后可根据该名字替换该块内容 --> <script src="/static/jquery.min.js"></script> {% block js %} {% endblock %} <!--block:母版的块 js:块名:继承该母版的模板可根据该块名替换该块内容--> </body> </html>
继承者(拥有母版的所有标签,且根据对应block位置插入自定制内容):
successor.html
{% extends 'master.html' %} {% block title %} {% endblock %} {% block conent %} {% endblock %} {% block css %} {% endblock %} {% block js %} {% endblock %}
需注意:
1.母版的固定代码,如果被修改,那么所有的继承模板都会修改到
2.css和js还是要注意,一定要在母版的head 和body最下面专门弄个块,这样继承模板才可以写自身的css 和js
include
导入局部母版
场景:标签重复被调用的时候,或者该标签代码多(为了页面的整洁)进而导入局部内容标签(允许被导入多次)
tag.html
<h1>xx<h1>
导入者(导入指定的文件以后,该文件的内容进入插入到include位置)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% include 'tag.html' %} </body> </html>
templatetags(simple_tag,filter)
实战django之simple_tag and filter: https://blog.youkuaiyun.com/Burgess_zheng/article/details/86548240
简单理解:HTML调用Python写的函数
系统自带simple.tag
自定制simple.tag
1.在某个app下创建一个templatetags目录(目录名不能更改其他的
2. templatetags目录下创建任意py文件(py文件名没限制)
3.py文件需要导入指定模块实例化一个template对象 (名字必须为:register = template.Library())
4.该对象调取继承类的simple_tag方法对自定义函数进行装饰 【装饰器:@register.simple_tag or @register.filter(有要求,参数固定最多2个)】
5. 注册 templatetags目录所在的app
6.模板文件调用
1.顶部导入自定义函数文件格式:{% load 要调取的函数所在文件名 %}
2.simple_tag调取函数格式: simple_tag{% 函数名 ”实参” ”实参” %} fiter: {{”实参”|函数名:”实参”}}
上一篇:Django之view视图处理【交互篇二】点击跳转
目录篇:Django之前后端交互篇目录 点击跳转
下一篇:Django之CSRF XSS原理解析【交互篇四】点击跳转