Django框架(三)
一、模板(Template)简介
1.简介
作为一个Web框架,Django需要一种动态生成HTML的便捷方式。最常见的方法依赖于模板。模板包含所需HTML输出的静态部分以及描述如何插入动态内容的一些特殊语法。
Django项目可以配置一个或多个模板引擎(如果不使用模板,甚至可以为零)。Django为其自己的模板系统提供内置后端,创造性地称为Django模板语言(DTL),以及流行的替代Jinja2。可以从第三方获得其他模板语言的后端。
Django定义了一个标准API,用于加载和呈现模板,无论后端如何。加载包括查找给定标识符的模板并对其进行预处理,通常将其编译为内存中表示。渲染意味着使用上下文数据插入模板并返回结果字符串。
由于历史原因,模板引擎的通用支持和Django模板语言的实现都存在于django.template 命名空间中。
2.模板系统简介
你可能已经注意到我们在例子视图中返回文本的方式有点特别。 也就是说,HTML被直接硬编码在 Python代码之中。
------------------------------------urls.py-----------------------------------------------
path('current_datetime', views.current_datetime),
------------------------------------views.py---------------------------------------------
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
尽管这种技术便于解释视图是如何工作的,但直接将HTML硬编码到你的视图里却并不是一个好主意。 让我们来看一下为什么:
-
对页面设计进行的任何改变都必须对 Python 代码进行相应的修改。 站点设计的修改往往比底层 Python 代码的修改要频繁得多,因此如果可以在不进行 Python 代码修改的情况下变更设计,那将会方便得多。
-
Python 代码编写和 HTML 设计是两项不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员(甚至不同部门)来完成。 设计者和HTML/CSS的编码人员不应该被要求去编辑Python的代码来完成他们的工作。
-
程序员编写 Python代码和设计人员制作模板两项工作同时进行的效率是最高的,远胜于让一个人等待另一个人完成对某个既包含 Python又包含 HTML 的文件的编辑工作。
基于这些原因,将页面的设计和Python的代码分离开会更干净简洁更容易维护。 我们可以使用 Django的 模板系统 (Template System)来实现这种模式,这就是本章要具体讨论的问题。
二、Django模板语言
Django模板只是一个文本文档或使用Django模板语言标记的Python字符串。一些构造由模板引擎识别和解释。主要是变量和标签。
使用上下文呈现模板。渲染将变量替换为其值,这些值在上下文中查找,并执行标记。其他所有内容都按原样输出。
Django模板语言的语法涉及四种结构。
组成:HTML代码+逻辑控制代码
1.模板
模板只是一个文本文件。它可以生成任何基于文本的格式(HTML,XML,CSV等)。
模板包含变量,这些变量在评估模板时将替换为值,而变量则包含控制模板逻辑的标记。
为什么使用基于文本的模板而不是基于XML的模板(如Zope的TAL)?我们希望Django的模板语言不仅可用于XML / HTML模板。在World Online,我们将其用于电子邮件,JavaScript和CSV。您可以将模板语言用于任何基于文本的格式。
2.变量
变量从上下文输出一个值,这是一个类似于dict的对象,它将键映射到值。
变量(使用双大括号来引用变量):语法格式: {
{var_name}}
当模板引擎遇到变量时,它会计算该变量并将其替换为结果。变量名由字母数字字符和下划线()的任意组合组成,但不能以下划线开头。重要的是,变量名称中不能包含空格或标点符号
在 Django 模板中遍历复杂数据结构的关键是句点字符 (.)
注意点
从技术上讲,当模板系统遇到一个点时,它会按以下顺序尝试以下查找:
1.字典查找
2.属性或方法查找
3.数字索引查找
如果结果值是可调用的,则调用它时不带参数。调用的结果成为模板值。
此查找顺序可能会导致覆盖字典查找的对象出现一些意外行为。
字典查找,属性查找和列表索引查找使用点表示法实现:
{
{ my_dict.key }}
{
{ my_object.attribute }}
{
{ my_list.0 }}
# 首先,句点可用于访问列表索引,例如:
-------------------------------views.py--------------------------------
def test(request):
test_list = ["xiaoming","baidu"]
return render(request,"test.html",locals())
--------------------------------test.html------------------------------
<body>
<p>hello {
{ test_list }}</p>
<p>hello {
{ test_list.0