#一下代码是先的在网页当中嵌入当前时间 import datetime def timer(request): now_time=datetime.datetime.now() html="<html><body>Now is :%s</body></html>" % now_time return HttpReponse(html) #这样会在网页中嵌入数据,可是,若是数据庞大,繁多,代码写起来就比较乱,尽管这种技术便于解释视图是如何工做的,但直接将HTML硬编码到你的视图里却并非一个好的主意。
#一下代码是先的在网页当中嵌入当前时间
import datetime
def timer(request):
now_time=datetime.datetime.now()
html="<html><body>Now is :%s</body></html>" % now_time
return HttpReponse(html)
#这样会在网页中嵌入数据,可是,若是数据庞大,繁多,代码写起来就比较乱,尽管这种技术便于解释视图是如何工做的,但直接将HTML硬编码到你的视图里却并非一个好的主意。
#推荐下面写法(方便代码的修改) #Python代码 import datetime def now_time(request): now=datetime.datetime.now() return render(request,'now_time.html',{'now_time':str(now_time)}) #html代码(代码写在HTML页面当中) <body> <h1>如今的时间:{{ now_time }}</h1> </body>
#推荐下面写法(方便代码的修改)
#Python代码
import datetime
def now_time(request):
now=datetime.datetime.now()
return render(request,'now_time.html',{'now_time':str(now_time)})
#html代码(代码写在HTML页面当中)
<body>
<h1>如今的时间:{{ now_time }}</h1>
</body>
#在HTML中取值方式{{ var_name }}或者{{ var_name.索引 }}
#在HTML中取值方式{{ var_name }}或者{{ var_name.索引 }}
#python 代码 def index(request): # 字符串 character_string character_string = 'hello' # 列表list_l list_l = ['old', 'boy', 'education'] # 字典dict_d dict_d = {"teacher": "Teacher_wang", "student": "student_li"} date_time=datetime.date(2017,10,24) # 自定义类对象 class Person(): def __init__(self, name, age): self.name = name self.age = age person_li=Person("teacher_li",19) person_zhang=Person("teacher_zhang",18) person_wang=Person("teacher_wang",17) person_zhao=Person("teacher_zhao",20) person_list=[person_li,person_zhang,person_wang,person_zhao] return render(request,"index.html", {"character_string":character_string, "list_l":list_l, "dict_d":dict_d, "date_time":date_time, "person_list":person_list } )
#python 代码
def index(request):
# 字符串 character_string
character_string = 'hello'
# 列表list_l
list_l = ['old', 'boy', 'education']
# 字典dict_d
dict_d = {"teacher": "Teacher_wang", "student": "student_li"}
date_time=datetime.date(2017,10,24)
# 自定义类对象
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
person_li=Person("teacher_li",19)
person_zhang=Person("teacher_zhang",18)
person_wang=Person("teacher_wang",17)
person_zhao=Person("teacher_zhao",20)
person_list=[person_li,person_zhang,person_wang,person_zhao]
return render(request,"index.html",
{"character_string":character_string,
"list_l":list_l,
"dict_d":dict_d,
"date_time":date_time,
"person_list":person_list
}
)
<body> <h3>字符串:{{ character_string }}</h3> <hr> <h3>列表第一个值:{{ list_l.0 }}</h3> <h3>列表第二个值:{{ list_l.1 }}</h3> <h3>列表第三个值:{{ list_l.2 }}</h3> <hr> <h3>字典的第一个key的值:{{ dict_d.teacher }}</h3> <h3>字典的第二个key的值:{{ dict_d.student }}</h3> <hr> <h3>日期 年:{{ date_time.year }}</h3> <h3>日期 月:{{ date_time.month }}</h3> <h3>日期 日:{{ date_time.day }}</h3> <hr> <h3>自定义类对象的第一个值的姓名和年龄:{{ person_list.0.name }},{{ person_list.0.age }}</h3> <h3>自定义类对象的第二个值的姓名和年龄:{{ person_list.1.name }},{{ person_list.1.age }}</h3> <h3>自定义类对象的第三个值的姓名和年龄:{{ person_list.2.name }},{{ person_list.2.age }}</h3> <h3>自定义类对象的第四个值的姓名和年龄:{{ person_list.3.name }},{{ person_list.3.age }}</h3> </body> #注意:句点福也能够应用对象的方法(无参数的方法) <h3>字典的第二个key的值:{{ dict_d.student.upper }}</h3>
<body>
<h3>字符串:{{ character_string }}</h3>
<hr>
<h3>列表第一个值:{{ list_l.0 }}</h3>
<h3>列表第二个值:{{ list_l.1 }}</h3>
<h3>列表第三个值:{{ list_l.2 }}</h3>
<hr>
<h3>字典的第一个key的值:{{ dict_d.teacher }}</h3>
<h3>字典的第二个key的值:{{ dict_d.student }}</h3>
<hr>
<h3>日期 年:{{ date_time.year }}</h3>
<h3>日期 月:{{ date_time.month }}</h3>
<h3>日期 日:{{ date_time.day }}</h3>
<hr>
<h3>自定义类对象的第一个值的姓名和年龄:{{ person_list.0.name }},{{ person_list.0.age }}</h3>
<h3>自定义类对象的第二个值的姓名和年龄:{{ person_list.1.name }},{{ person_list.1.age }}</h3>
<h3>自定义类对象的第三个值的姓名和年龄:{{ person_list.2.name }},{{ person_list.2.age }}</h3>
<h3>自定义类对象的第四个值的姓名和年龄:{{ person_list.3.name }},{{ person_list.3.age }}</h3>
</body>
#注意:句点福也能够应用对象的方法(无参数的方法)
<h3>字典的第二个key的值:{{ dict_d.student.upper }}</h3>
{{obj|filter__name:param}} #练习:(template) {#default : 若是一个变量是空或者false,使用给定的默认值。不然使用变量的值,也能够成为解释文本#} <h3>{{ value_null|default:"该变量为空" }}</h3> {#lengh :返回值得长度,对字符串和列表都起做用#} <h3>{{ value|length }}</h3> {#将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)#} <h3>{{ value_size|filesizeformat }}</h3> {#格式化输出时间#} <h3>{{ value_date|date:"Y-m-d" }}</h3> {#切片#} <h3>{{ value|slice:"2:-1" }}</h3> {#若是字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。参数:要截断的字符数#} <h3>{{ value|truncatechars:30 }}</h3> #views: def index(request): value_null='' value="The purpose of life is to live it, to taste experience to the utmost, to reach out eagerly and without fear for newer and richer experience." value_size='0726' value_date=datetime.datetime.now() return render(request,'index.html', {"value_null":value_null, "value":value, "value_size":value_size, "value_date":value_date})
{{obj|filter__name:param}}
#练习:(template)
{#default : 若是一个变量是空或者false,使用给定的默认值。不然使用变量的值,也能够成为解释文本#}
<h3>{{ value_null|default:"该变量为空" }}</h3>
{#lengh :返回值得长度,对字符串和列表都起做用#}
<h3>{{ value|length }}</h3>
{#将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)#}
<h3>{{ value_size|filesizeformat }}</h3>
{#格式化输出时间#}
<h3>{{ value_date|date:"Y-m-d" }}</h3>
{#切片#}
<h3>{{ value|slice:"2:-1" }}</h3>
{#若是字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。参数:要截断的字符数#}
<h3>{{ value|truncatechars:30 }}</h3>
#views:
def index(request):
value_null=''
value="The purpose of life is to live it, to taste experience to the utmost, to reach out eagerly and without fear for newer and richer experience."
value_size='0726'
value_date=datetime.datetime.now()
return render(request,'index.html',
{"value_null":value_null,
"value":value,
"value_size":value_size,
"value_date":value_date})
#for标签 #遍历每个元素: {% for person in person_list %} <h1>姓名:{{ person.name }}年龄:{{ person.age }}</h1> {% endfor %} #views代码: class Person(): def __init__(self, name, age): self.name = name self.age = age person_li=Person("teacher_li",19) person_zhang=Person("teacher_zhang",18) person_wang=Person("teacher_wang",17) person_zhao=Person("teacher_zhao",20) person_list=[person_li,person_zhang,person_wang,person_zhao] return render(request,'index.html',{"person_list":person_list}) #也能够反向循环 在for循环结尾加上reversed({% for person in person_list reversed %}) #注:循环序号能够经过{{forloop}}显示 {% for key,val in dict_d.items %} <h1>{{ forloop.counter }}key:{{ key }} val:{{ val }}</h1> {% endfor %}
#for标签
#遍历每个元素:
{% for person in person_list %}
<h1>姓名:{{ person.name }}年龄:{{ person.age }}</h1>
{% endfor %}
#views代码:
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
person_li=Person("teacher_li",19)
person_zhang=Person("teacher_zhang",18)
person_wang=Person("teacher_wang",17)
person_zhao=Person("teacher_zhao",20)
person_list=[person_li,person_zhang,person_wang,person_zhao]
return render(request,'index.html',{"person_list":person_list})
#也能够反向循环 在for循环结尾加上reversed({% for person in person_list reversed %})
#注:循环序号能够经过{{forloop}}显示
{% for key,val in dict_d.items %}
<h1>{{ forloop.counter }}key:{{ key }} val:{{ val }}</h1>
{% endfor %}
for...empty #for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,能够有所操做。 {% for key,val in dict_d.items %} <p>{{ key }}</p> {% empty %} <p>sorry,no person here</p> {% endfor %}
for...empty
#for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,能够有所操做。
{% for key,val in dict_d.items %}
<p>{{ key }}</p>
{% empty %}
<p>sorry,no person here</p>
{% endfor %}
#if 标签 #{% if %}会对一个变量求值,若是它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出 {% if num > 100 or num < 0 %} <p>无效</p> {% elif num > 80 and num < 100 %} <p>优秀</p> {% else %} <p>凑活吧</p> {% endif %}
#if 标签
#{% if %}会对一个变量求值,若是它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出
{% if num > 100 or num < 0 %}
<p>无效</p>
{% elif num > 80 and num < 100 %}
<p>优秀</p>
{% else %}
<p>凑活吧</p>
{% endif %}
#with #使用一个简单地名字缓存一个复杂的变量,当你须要使用一个“昂贵的”方法(好比访问数据库)不少次的时候是很是有用的 {% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}
#with
#使用一个简单地名字缓存一个复杂的变量,当你须要使用一个“昂贵的”方法(好比访问数据库)不少次的时候是很是有用的
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
#1.建立完.py文件以后第一件事就是先导入wenjian from django import template from django.utils.safestring import mark_safe register = template.Library() #register的名字是固定的,不可改变 #2.其次开始写代码(相似装饰器的东西必须加) @register.filter def multi(v1,v2): return v1 * v2 #3.在使用自定义simple_tag和filter的html文件中导入以前建立的 my_tags.py #导入方法 {% load mytag %} #4.调用方式 <h1>{{ i|multi:6 }}</h1>#(i的值是666)
#1.建立完.py文件以后第一件事就是先导入wenjian
from django import template
from django.utils.safestring import mark_safe
register = template.Library() #register的名字是固定的,不可改变
#2.其次开始写代码(相似装饰器的东西必须加)
filter .
def multi(v1,v2):
return v1 * v2
#3.在使用自定义simple_tag和filter的html文件中导入以前建立的 my_tags.py
#导入方法
{% load mytag %}
#4.调用方式
<h1>{{ i|multi:6 }}</h1>#(i的值是666)
#导入的方法跟上面同样,调用的时候有点不同。 #1.先建立标签 @register.simple_tag def multiTag(x,y): return x*y #2.调用muliTag <h1>{% multiTag 33 66 %}</h1>
#导入的方法跟上面同样,调用的时候有点不同。
#1.先建立标签
simple_tag .
def multiTag(x,y):
return x*y
#2.调用muliTag
<h1>{% multiTag 33 66 %}</h1>
#1.配置静态文件的路径,在settings.py文件中添加以下代码: STATICFILES_DIRS=[ os.path.join(BASE_DIR,"static") ] #2.建立名称为static的文件,而后在其目录下添加静态文件如bootstrap,jquery等文件 #3.在html文件中引入文件 <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css"> <script src="/static/jquery-3.2.1.js"></script> <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
#1.配置静态文件的路径,在settings.py文件中添加以下代码:
STATICFILES_DIRS=[
os.path.join(BASE_DIR,"static")
]
#2.建立名称为static的文件,而后在其目录下添加静态文件如bootstrap,jquery等文件
#3.在html文件中引入文件
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
<script src="/static/jquery-3.2.1.js"></script>
<script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
#Django模版引擎中最强大也是最复杂的部分就是模版继承了。模版继承可让您建立一个基本的“骨架”模版,它包含您站点中的所有元素,而且能够定义可以被子模版覆盖的 blocks 。 #示例代码: #母版中的代码 <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta charset="UTF-8"> <title>{% block title %}Title{% endblock %}</title> <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css"> <script src="/static/jquery-3.2.1.js"></script> <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script> <style> .body_top{ width: 100%; height: 50px; background-color: #000000; } .body_menu{ width:25%; height: 450px; background-color: #cccccc; float: left; } .body_right{ width:75%; height: 450px; float: left; } .body_bottom{ width: 100%; height: 50px; background-color: #0f0f0f; } </style> </head> <body> <div class="container-fluid"> <div class="row"> <div class="body_top"></div> </div> <div class="row"> <div class="body_menu"> {% block menu %} <ul> <li><a href="/student_info/1">班级一</a></li> <li><a href="/student_info/2">班级二</a></li> <li><a href="/student_info/3">班级三</a></li> </ul> {% endblock %} </div> <div class="body_right"> {% block right %} {% endblock %} </div> </div> <div class="row"> <div class="body_bottom"></div> </div> </div> <button class="btn btn-success">添加</button> </body> </html> #这个模版,咱们把它叫做 base.html, 它定义了一个能够用于两列排版页面的简单HTML骨架。“子模版”的工做是用它们的内容填充空的blocks。 #在这个例子中, block 标签订义了三个能够被子模版内容填充的block。 block 告诉模版引擎: 子模版可能会覆盖掉模版中的这些位置。 #子模版可能看起来是这样的: {% extends "base.html" %} {% block menu %} <ul> <li><a href="">学生信息一</a></li> <li><a href="">学生信息二</a></li> <li><a href="">学生信息三</a></li> </ul> {% endblock %} {% block right %} <h1>班级信息</h1> <h3>{{ classId }}班</h3> {% endblock %} #extends 标签是这里的关键。它告诉模版引擎,这个模版“继承”了另外一个模版。当模版系统处理这个模版时,首先,它将定位父模版——在此例中,就是“base.html”。 # #那时,模版引擎将注意到 base.html 中的三个 block 标签,并用子模版中的内容来替换这些block。根据 blog_entries 的值,输出可能看起来是这样的: <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css"> <script src="/static/jquery-3.2.1.js"></script> <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script> <style> .body_top{ width: 100%; height: 50px; background-color: #000000; } .body_menu{ width:25%; height: 450px; background-color: #cccccc; float: left; } .body_right{ width:75%; height: 450px; float: left; } .body_bottom{ width: 100%; height: 50px; background-color: #0f0f0f; } </style> </head> <body> <div class="container-fluid"> <div class="row"> <div class="body_top"></div> </div> <div class="row"> <div class="body_menu"> <ul> <li><a href="">学生信息一</a></li> <li><a href="">学生信息二</a></li> <li><a href="">学生信息三</a></li> </ul> </div> <div class="body_right"> <h1>班级信息</h1> <h3>{{ classId }}班</h3> </div> </div> <div class="row"> <div class="body_bottom"></div> </div> </div> <button class="btn btn-success">添加</button> </body> </html> #请注意,子模版并无定义 sidebar block,因此系统使用了父模版中的值。父模版的 {% block %} 标签中的内容老是被用做备选内容(fallback)。 #####这种方式使代码获得大程度的服用而且使得添加内容到共享的内容区域更加简单,例如,部分范围内的导航。
x
#Django模版引擎中最强大也是最复杂的部分就是模版继承了。模版继承可让您建立一个基本的“骨架”模版,它包含您站点中的所有元素,而且能够定义可以被子模版覆盖的 blocks 。
#示例代码:
#母版中的代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<title>{% block title %}Title{% endblock %}</title>
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
<script src="/static/jquery-3.2.1.js"></script>
<script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
<style>
.body_top{
width: 100%;
height: 50px;
background-color: #000000;
}
.body_menu{
width:25%;
height: 450px;
background-color: #cccccc;
float: left;
}
.body_right{
width:75%;
height: 450px;
float: left;
}
.body_bottom{
width: 100%;
height: 50px;
background-color: #0f0f0f;
}
</style>
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="body_top"></div>
</div>
<div class="row">
<div class="body_menu">
{% block menu %}
<ul>
<li><a href="/student_info/1">班级一</a></li>
<li><a href="/student_info/2">班级二</a></li>
<li><a href="/student_info/3">班级三</a></li>
</ul>
{% endblock %}
</div>
<div class="body_right">
{% block right %}
{% endblock %}
</div>
</div>
<div class="row">
<div class="body_bottom"></div>
</div>
</div>
<button class="btn btn-success">添加</button>
</body>
</html>
#这个模版,咱们把它叫做 base.html, 它定义了一个能够用于两列排版页面的简单HTML骨架。“子模版”的工做是用它们的内容填充空的blocks。
#在这个例子中, block 标签订义了三个能够被子模版内容填充的block。 block 告诉模版引擎: 子模版可能会覆盖掉模版中的这些位置。
#子模版可能看起来是这样的:
{% extends "base.html" %}
{% block menu %}
<ul>
<li><a href="">学生信息一</a></li>
<li><a href="">学生信息二</a></li>
<li><a href="">学生信息三</a></li>
</ul>
{% endblock %}
{% block right %}
<h1>班级信息</h1>
<h3>{{ classId }}班</h3>
{% endblock %}
#extends 标签是这里的关键。它告诉模版引擎,这个模版“继承”了另外一个模版。当模版系统处理这个模版时,首先,它将定位父模版——在此例中,就是“base.html”。
#
#那时,模版引擎将注意到 base.html 中的三个 block 标签,并用子模版中的内容来替换这些block。根据 blog_entries 的值,输出可能看起来是这样的:
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
<script src="/static/jquery-3.2.1.js"></script>
<script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
<style>
.body_top{
width: 100%;
height: 50px;
background-color: #000000;
}
.body_menu{
width:25%;
height: 450px;
background-color: #cccccc;
float: left;
}
.body_right{
width:75%;
height: 450px;
float: left;
}
.body_bottom{
width: 100%;
height: 50px;
background-color: #0f0f0f;
}
</style>
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="body_top"></div>
</div>
<div class="row">
<div class="body_menu">
<ul>
<li><a href="">学生信息一</a></li>
<li><a href="">学生信息二</a></li>
<li><a href="">学生信息三</a></li>
</ul>
</div>
<div class="body_right">
<h1>班级信息</h1>
<h3>{{ classId }}班</h3>
</div>
</div>
<div class="row">
<div class="body_bottom"></div>
</div>
</div>
<button class="btn btn-success">添加</button>
</body>
</html>
#请注意,子模版并无定义 sidebar block,因此系统使用了父模版中的值。父模版的 {% block %} 标签中的内容老是被用做备选内容(fallback)。
#####这种方式使代码获得大程度的服用而且使得添加内容到共享的内容区域更加简单,例如,部分范围内的导航。
#里是使用继承的一些提示: #1.若是你在模版中使用 {% extends %} 标签,它必须是模版中的第一个标签。其余的任何状况下,模版继承都将没法工做。 #在base模版中设置越多的 {% block %} 标签越好。请记住,子模版没必要定义所有父模版中的blocks,因此,你能够在大多数blocks中填充合理的默认内容,而后,只定义你须要的那一个。多一点钩子总比少一点好。 #3.若是你发现你本身在大量的模版中复制内容,那可能意味着你应该把内容移动到父模版中的一个 {% block %} 中。 #4.为了更好的可读性,你也能够给你的 {% endblock %} 标签一个 名字 例如: {% block content %} ... {% endblock content %} #5.最后,请注意您并不能在一个模版中定义多个相同名字的 block 标签。这个限制的存在是由于block标签的做用是“双向”的。这个意思是,block标签不只提供了一个坑去填,它还在 _父模版_中定义了填坑的内容。若是在一个模版中有两个名字同样的 block 标签,模版的父模版将不知道使用哪一个block的内容。
x
#里是使用继承的一些提示:
#1.若是你在模版中使用 {% extends %} 标签,它必须是模版中的第一个标签。其余的任何状况下,模版继承都将没法工做。
#在base模版中设置越多的 {% block %} 标签越好。请记住,子模版没必要定义所有父模版中的blocks,因此,你能够在大多数blocks中填充合理的默认内容,而后,只定义你须要的那一个。多一点钩子总比少一点好。
#3.若是你发现你本身在大量的模版中复制内容,那可能意味着你应该把内容移动到父模版中的一个 {% block %} 中。
#4.为了更好的可读性,你也能够给你的 {% endblock %} 标签一个 名字 例如:
{% block content %}
...
{% endblock content %}
#5.最后,请注意您并不能在一个模版中定义多个相同名字的 block 标签。这个限制的存在是由于block标签的做用是“双向”的。这个意思是,block标签不只提供了一个坑去填,它还在 _父模版_中定义了填坑的内容。若是在一个模版中有两个名字同样的 block 标签,模版的父模版将不知道使用哪一个block的内容。