一.模版标签
当我们要用Python语句去调用模版变量时就要用到模版标签
当我们在视图函数里面定义一个字典,在模版文件里面用普通的方法引用时会用如下方法
#teacher/view.py
def index(requese):
students = [
{'name':'张三','sex':'男','age':'33'},
{'name':'李四','sex':'男','age':'22'},
{'name':'王五','sex':'男','age':'25'},
]
return render(request,'teacher/index.html',context='{'student':students}')
#templater/teacher/index.html
<table>
<thead>
<tr>
<th>姓名</th><th>性别</th><th>年龄</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{students.0.name}}</td>
<td>{{students.0.sex}}</td>
<td>{{students.0.age}}</td>
</tr>
<tr>
<td>{{students.1.name}}</td>
<td>{{students.1.sex}}</td>
<td>{{students.1.age}}</td>
</tr>
<tr>
<td>{{students.2.name}}</td>
<td>{{students.2.sex}}</td>
<td>{{students.2.age}}</td>
</tr>
</tbody>
</table>
这样的引用属于硬编码,非常不实用,所以要用到模版标签,可以将上面的代码作如下修改
#templater/teacher/index.html
<table>
<thead>
<tr>
<th>姓名</th><th>性别</th><th>年龄</th>
</tr>
</thead>
<tbody>
{% for student in students%}
<tr>
<td>{{student.name}}</td>
<td>{{student.sex}}</td>
<td>{{student.age}}</td>
</tr>
{% endif %}
</tbody>
</table>
上面和下面的index.html结果是一样的
常用标签
(1)if/elif/else:可以使用and/or/in/not/==/!=/<=/>=,来进行判断。ifequal/ifnotequal
(2)for…in…:跟python中的for…in…是一样的用法。
forloop.counter:当前迭代的次数,下标从1开始。
forloop.counter0:当前迭代的次数,下标从0开始。
forloop.revcounter:跟forloop.counter一样,下标从大到小。
forloop.revcounter0:跟forloop.counter0一样,下标从大到小。
forloop.first:返回bool类型,如果是第一次迭代,返回true,否则返回false。
forloop.last:返回bool类型,如果是最后一次迭代,返回True,否则返回False。
forloop.parentloop:如果发生多层for循环嵌套,那么这个变量返回的是上一层的for
(3)for…in…empty…:如果没有数据,跳转到empty中。
(4)load:加载第三方标签。最常用的是{%load static%}
(5)url:返回一个命名了的URL的绝对路径。
(6)with:缓存一个变量。
(7)autoescape:开启和关闭自动转义。
URL反向解析
通常当我们点开一个详情页面的时候,会跳转到另一个URL,这时候会用到模板标签里面的URL反向解析
使用方法:
- 先定义好视图函数
def student_detail_view(request,pk):
students = {
1:{'name':'李萌','sex':'302','age':'16','hobby':['看书','看电影','骑车']},
2:{'name':'张杨','sex':'301','age':'80','hobby':['看书','看电影','骑车']},
3:{'name':'鸣人','sex':'301','age':'18','hobby':['看书','看电影','骑车']}
}
if pk in students:
student = students[pk]
else:
student = "没有此人"
return render(request,'teacher/student_detail.html',context={'student':student})
- 简单编辑一个详情页模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生详情页</title>
</head>
<body>
学生详情:{{ student }}
</body>
</html>
- 定义好 URL 路由
from django.urls import path,re_path
from . import views
app_name = 'teacher'
urlpatterns = [
path('students/',views.students_view),
path('studentDetail/<int:pk>',views.student_detail_view,name='studentDetail')
]
- 在模板文件中加入a标签,用URL模板标签定义a标签的路由
{% for student in students %}
<tr {% if student.sex == '女' %} style="background-color: darksalmon"
{% else %} style="background-color:aquamarine"
{% endif %}>
<td><a href="{% url 'teacher:studentDetail' student.id %}">{{student.id}}</a></td>
<td>{{student.name}}</td>
<td>{{student.sex|convert_male}}</td>
<td>{{student.age}}</td>
<td>
{% show_list student.hobby %}
</td>
</tr>
二.模板的继承与引用
1.模板继承
每个不同的页面基本上都有相同的公共的部分,我们可以把这些公共的部分单独拿出来当作基本模板(base),然后在不同的模板中继承这个基本模板
a. 先创建一个base模板
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>{% block title %}这是首页{% endblock %}</title>
<!-- Bootstrap -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
<!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
<!--[if lt IE 9]>
<script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<![endif]-->
</head>
<body>
{% block content %}
{% endblock %}
</tbody>
</table>
<!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
</body>
</html>
上面用到了 block
标签, {% block name %} 与 {% endblock %} 之间就是继承基本模板的页面可以根据不同情况改写的内容块
b.继承基本模板
{% extends 'teacher/base.html' %}
只要在模板头部添加一个extends
标签,就能继承base.html所有的公共部分,然后在 {% block name %} 与 {% endblock %}中添加自己想要的内容
2.模板引用
当我们需要在一个模板中引入另外一个模板时,比如插入一段广告,我们就会用到模板的引用
模板的引入比较简单,只需要用到include
模板标签
{% block ad %}
<div style="position: fixed;bottom: 0px">
{% include 'teacher/ad.html' %}
</div>
{% endblock %}
include
和block
灵活使用就能做到灵活的插入广告
网友评论