模板
作为一个Web框架,Django需要一种方便的方式来动态生成html。最常见的方法依赖于模板。模板包含所需HTML输出的静态部分以及描述如何插入动态内容的特殊语法。
Django项目可以配置一个或多个模板引擎(如果不使用模板,甚至可以设置为零)。Django为其自己的模板系统提供内置后端,创造性地称为Django模板语言(DTL),以及流行的替代Jinja2。其他模板语言的后端可能来自第三方。
Django定义了一个用于加载和呈现模板的标准API,无论后端如何。加载包括为给定标识符查找模板并对其进行预处理,通常将其编译为内存中表示。渲染意味着用上下文数据插入模板并返回结果字符串。
在Django的模板语言是Django自己的模板系统。在Django 1.8之前,它是唯一可用的内置选项。这是一个很好的模板库,尽管它颇有见地,并且体现了一些特质。如果您没有迫切的理由选择另一个后端,那么应该使用DTL,尤其是在编写可插入应用程序并且您打算分发模板时。包含模板的Django的contrib应用程序(如django.contrib.admin)使用DTL。
模板的组成:
html代码+views的逻辑控制代码
语法格式:{{ variable }}
Template和Context:模板和上下文
模板实质上就是html+内含的变量
Context就是可以在视图层的变量寻找对应的前端模板变量,进行匹配
Template模板:内含变量 name、times
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>djangotest</title>
{% load staticfiles %}
</head>
<body>
<h2>hello this is the first django project</h2>
<h1>hello:{{name}}时间:{{times}}</h1>
{#<script src="/static/jquery-3.1.1.js"></script>#}
<script src="{% static "jquery-3.1.1.js" %}"></script>
<script>
$("h1").css("color","red")
</script>
</body>
</html>
views.py
from django.shortcuts import render, HttpResponse, render_to_response, redirect
import time
# Create your views here.
def clock_time(request):
times = time.ctime()
name = "mzc"
# return render_to_response("index.html", {"times": times, "name":name})
return render_to_response("index.html", locals()) # 当局部变量很多时,使用locals()识别局部变量方便
结果:
如果这里还是不能够说明模板与Context的关系,
那就使用这个新的命令:>>>python manage.py shell 进入django调试终端
尝试以下代码:
>>>from django manage.py import Template, Context
>>>t = Template("hello {{ name }}")
>>>c = Context({"name": "mzc"})
>>>t.render(c)
out: hello mzc
同一个模板,多个上下文,如果模板对象已经存在了,就可以使用这一个模板渲染多个Context,更为高效
low:
for name in (‘mzc‘,‘age‘,‘test‘):
t = Template("hello {{ name }}")
print(t.render(Context({"name":name})))
out:
hello mzc
hello age
hello test
good:
t = Template("hello {{ name }}")
for name in (‘mzc‘,‘age‘,‘test‘):
print(t.render(Context({"name":name})))
out:
hello mzc
hello age
hello test
从上面结果看两者输出是相同的,但是前者创建了三次模板,后者只有一次。
模板中的变量可以为那些类型:
事实上可以为,列表,字典,对象:
eg:
show_name.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>hello {{ a.0 }}</h1>
<h1>hello {{ a.1 }}</h1>
<h1>hello {{ a.2 }}</h1>
<h1>hello {{ d.name }}</h1>
<h1>hello {{ d.age }}</h1>
<h1>hello {{ d.sex }}</h1>
<h1>hello {{ c.name }}</h1>
<h1>hello {{ c.sex }}</h1>
</body>
</html>
views.py
from django.shortcuts import render, HttpResponse
import time
# Create your views here.
class Application(object):
def __init__(self, name, sex):
self.name = name
self.sex = sex
def show_name(request):
a = [‘mzc‘, ‘dhg‘, ‘alex‘]
d = {"name": "mzc", "age": 18, "sex": "girl"}
c = Application("mzc", "girl")
return render(request, "show_name.html", locals()) # 在逻辑层使用locals()方法 在Template中必须取值必须以函数内局部变量名称进行取值操作
# 在模板中的渲染对象可以为列表、字典、对象
out:
这里需要特别说明的就是不同类型的值是如何渲染在模板的:
通常的Python list dict这些要么通过索引取值,要么是通过键取值,而在模板语言中。
想要渲染出值:满足两点:
1.模板语言变量与视图函数对象类型相对于,如视图中一个字典为d name模板变量也要为d
2.通过英文中的句号进行取值操作 如:视图函数中一个dict对象d,取值方式为d点key 取出值。