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 %} 标签,父模板将无从得知要使用哪个块的内容。

 

posted on 2018-04-23 20:08  虫子小孩  阅读(192)  评论(0)    收藏  举报