1、模板变量
模板的组成:HTML+逻辑控制代码
原理:简单的来说就是两个对象,一个模板对象,一个上下文对象!
模板对象: 是一个HTML页面
上下文对象:是咱使用的具体变量值!
1.1 简单变量
变量的语法格式:
{{ 变量名 }}

一个模板创建了,可以反复使用!!
简写为:

1.2 复杂变量的使用:
在 Django 模板中遍历复杂数据结构的关键是句点字符 (.)。
1 ----- views---------------- 2 ## 自定义类 3 class Animal(): 4 def __init__(self,name,sex): 5 self.name = name 6 self.sex = sex 7 8 ## 深度查询 9 def query(req): 10 #1、列表 11 l = ['傻子','二鬼头','二傻子'] ## 列表对象 12 #2、字典 13 d = {"name":"大大","age":18,"hobby":"男"} 14 return render(req,"index.html",{"action":l}) 15 #3、自定义对象 16 c = Animal("alex","公") 17 return render(req,"index.html",locals()) 18 19 ----- html------------------------- 20 {# 深度查询 ---- .0 取出数值#} 21 {#1、取出对象:#} 22 <h1>hello{{ action}} </h1> 23 <h1>hello{{ action.1}} </h1> 24 25 {#2、字典#} 26 <h1>hello{{ d}} </h1> 27 <h1>hello{{ d.name}} </h1> 28 <h1>hello{{ d.age}} </h1> 29 30 {#2、自定义对象#} 31 <h1>hello{{ c.name}} </h1> 32 <h1>hello{{ c.sex}} </h1>
2、模板过滤器
语法格式:{{obj | flter:param}}
1 # 1 add : 给变量加上相应的值 2 # 3 # 2 addslashes : 给变量中的引号前加上斜线 4 # 5 # 3 capfirst : 首字母大写 6 # 7 # 4 cut : 从字符串中移除指定的字符 8 # 9 # 5 date : 格式化日期字符串 Y-m-d 10 # 11 # 6 default : 如果值是False,就替换成设置的默认值,否则就是用本来的值 12 # 13 # 7 default_if_none: 如果值是None,就替换成设置的默认值,否则就使用本来的值 14 15 例子: 16 17 {# 过滤函数#} 18 {# 意思:把d.age+12 在页面上显示出来,#} 19 <h1>真实年龄 {{ d.age| add:12 }}</h1> 20 21 <h1>{{ test|capfirst}}</h1> 22 23 {# 默认时间格式#} 24 <h1>{{ t}}</h1> 25 {#修改时间格式#} 26 <h1>{{ t| date:"Y-m-d"}}</h1> ## 显示为:2018-4-2
27
28 ## 混淆点: 要是想要传入过去的意义是html的字符串,能够被渲染,那么要加上safe
29 比如:
30 ------ veiw---
31 a = "<a href="">click</a> " # z正常不会被渲染,因为传入的是字符串,Django不知道,所以显示的也是字符串
32 -------html----
33 <h1>{{a | safe }}</h1> # 告诉Django是安全的。。。?? 这里暂时不知道为啥
34 还有一种关闭安全机制的写法,效果跟safe差不多,写法如下
35 {% autoescape off %}
36 {{ a}} ## 同样a也变成了可以点击,被浏览器渲染
37 {% endautoescape %}
3、标签(tag)的使用()
{% tagas %}
a = "<a href=''>click</a>"
3.1 {% if %}
1 {#if的使用#} 2 {% if d.age > 20 %} 3 {# <h1>hello{{ d.name }}</h1>#} 4 {# <h1>年龄: {{ d.age }}</h1>#} 5 {% if d.age < 50 %} 6 <h1>年龄: {{ d.age }} 大于20 ,小于50</h1> 7 {% else %} 8 <h1>年龄: {{ d.age }} 大于50 </h1> 9 {% endif %} 10 {% elif d.age > 10 %} 11 <h1>年龄: {{ d.age }} 大于10</h1> 12 {% endif %}
3.2 { % for %}
1 {#for循环遍历#} 2 {% for name in l %} 3 {# 取值 #} 4 <h1>{{ name }}</h1> 5 {# forloop.counter 索引(计数)对象#} 6 {# forloop.counter0从0 开始#} 7 {# 正序#} 8 <h1>{{ forloop.counter0 }} : {{ name }}</h1> 9 {# 反序#} 10 <h1>{{ forloop.revcounter0 }} : {{ name }}</h1> 11 12 {% endfor %} 13 14 --------------------- 15 {% for name in l %} 16 {% if forloop.first %} 17 <li class="first"> 18 {% else %} 19 <li> 20 {% endif %} 21 {{ name }} 22 </li> 23 {# 当遍历的列表为空,就显示这个#} 24 {% empty %} 25 <h1> 没有相关文章</h1> 26 {% endfor %}
3.3 安全机制
1 <form action="{% url 'login'%}" method="post"> 2 <p>姓名:<input type="text" name="user"></p> 3 <p>密码:<input type="text" name="pwd"></p> 4 <p><input type="submit" ></p> 5 {# 访问这个页面的,立马返回了这个页面包含这个钥匙,#} 6 {# 提交数据的时候,就还是会带这个钥匙回来,否则就会报错!!#} 7 {# 首先就会判断有没有正确钥匙,正确才会接受数据,否则不接受数据! 安全机制#} 8 {# 保证这个页面是Django访问的,才会带着这个钥匙!Django才会接受数据#} 9 {# 如果不想加这个,可以直接关闭掉这个安全机制#} 10 {% csrf_token %} 11 </form>
3.4 自定义fiter和simple_tag (自己定义功能)
a、在app中创建templatetags模块(必须是这个名字)
b、创建任意的.py文件,如:myTags.py

定义:
1 from django import template 2 from django.utils.safestring import mark_safe 3 4 ## register名字不可以改变!!! 否则Django不认识 5 register = template.Library() 6 7 8 # 1、自定义过滤器,只能有两个,一个是调用者,另一个是传入的参数!! 9 ## 必须要加上装饰器,否则不可用 10 @register.filter 11 def filter_multi(x, y): 12 ## 这个x是HTML中的调用者,y是filter_multi传入的一个参数 13 ## 意思是:这个标签库,只能传入一个参数!!唯一的一个!! 14 ## 若是要多个,可以传入一个列表 15 print(x,y) 16 return x * y 17 18 # 2、自定义标签,可以任意多个参数,但是自定义标签不能用在控制语句里面!! 19 @register.simple_tag() 20 def simple_tag_multi(x,y): 21 22 return x*y
c、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag
在创建工程的时候,若是写了app的名字,那么会默认配置!!
d、在使用自定义simple_tag和filter的html文件中导入之前创建的 myTags.py :{% load myTags %}
e、使用simple_tag和filter(如何调用),写完之后要重启一下server,让Django找到自定义的标签库
使用:
1 -------------- HTMl------------- 2 {#在html加载标签_过滤器库#} ## 无论自定义标签还是过滤器,都要引入 3 {% load myTag %} ##在HTML首行引入 4 5 .... 6 7 {#2、使用自定义过滤器#} 8 {#显示的结果是: age*3, 3是参数 ,一个参数是age,另外一个参数是3# } 9 {{ d.age | filter_multi:3}} 10 11 {#2、使用自定义标签#} 12 <h1>{% simple_tag_multi 3 8 %}</h1> ## 得到24
4、 extend模板继承
主要的作用就是减少重复代码!继承模板
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 {% block title%} 6 <title>欢迎使用</title> 7 {% endblock %} 8 9 <style type="text/css"> 10 *{ 11 margin: 0px; 12 padding: 0px; 13 } 14 .nav{ 15 line-height: 40px; 16 width: 100%; 17 background-color: #2459a2; 18 color: white; 19 font-size: 20px; 20 text-align: center; 21 } 22 .left{ 23 width: 20%; 24 min-height: 800px; 25 overflow: auto; 26 background-color: #ededed; 27 } 28 .manage{ 29 {#上下20px#} 30 padding: 20px 0; 31 {#左右居中了#} 32 text-align: center; 33 margin: 10px 0; 34 font-size: 18px; 35 } 36 a{ 37 {#取消下划线#} 38 text-decoration: none; 39 40 } 41 .content{ 42 width: 70%; 43 min-height: 800px; 44 } 45 46 {#靠左浮动-- 逗号隔开并集选择器#} 47 .left,.content{ 48 float: left; 49 } 50 h1,h2{ 51 text-align: center; 52 } 53 54 </style> 55 </head> 56 <body> 57 <div class="outer"> 58 <div class="nav">标题</div> 59 60 <div class="left"> 61 <div class="student manage"><a href="/student">学生管理</a> </div> 62 <div class="teacher manage"><a href="">老师管理</a> </div> 63 <div class="course manage"><a href="">课程管理</a> </div> 64 <div class="classes manage"><a href="">班级管理</a> </div> 65 66 </div> 67 <div class="content"> 68 69 {# 设置块,相当于在这里放置了一个盒子#} 70 {% block content %} 71 <h1>WELCOME TO LOGIN</h1> 72 {% endblock %} 73 74 </div> 75 </div> 76 77 </body> 78 </html>
1 {#继承base模板#} 2 {#现在student2和base.html是一模一样的页面,但是我们要修改里面的内容#} 3 {% extends "base.html" %} ## 必须在首行继承 4 5 {% block title %} 6 <title>学生信息</title> 7 {# 改变样式#} 8 <style type="text/css"> 9 h2{ 10 color: red; 11 } 12 </style> 13 {% endblock %} 14 15 {#更改base.html #} 16 {% block content %} 17 {# 1、拿到父类的内容#} 18 {{ block.super }} 19 {# 2、 直接改变全部盒子内容#} 20 {% for student in student_list %} 21 <h2>学生: {{ student }}</h2> 22 {% endfor %} 23 {% endblock %}
诀窍:
<1>如果在模板中使用 {% extends %} ,必须保证其为模板中的第一个模板标记。 否则,模板继承将不起作用。
<2>一般来说,基础模板中的 {% block %} 标签越多越好。 记住,子模板不必定义父模板中所有的代码块,因此
你可以用合理的缺省值对一些代码块进行填充,然后只对子模板所需的代码块进行(重)定义。 俗话说,钩子越
多越好。
<3>如果发觉自己在多个模板之间拷贝代码,你应该考虑将该代码段放置到父模板的某个 {% block %} 中。
如果你需要访问父模板中的块的内容,使用 {{ block.super }}这个标签吧,这一个魔法变量将会表现出父模
板中的内容。 如果只想在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了。
<4>不允许在同一个模板中定义多个同名的 {% block %} 。 存在这样的限制是因为block 标签的工作方式是双向的。
也就是说,block 标签不仅挖了一个要填的坑,也定义了在父模板中这个坑所填充的内容。如果模板中出现了两个
相同名称的 {% block %} 标签,父模板将无从得知要使用哪个块的内容。
有生之年,只诉衷肠不言殇.....
浙公网安备 33010602011771号