天天看点

Python Django Web 框架编程 - 模板 templates

作者:逸剑听潮

之前的例子中,HttpResponse都是把结果直接显示在页面上,也就是页面的设计写死在视图函数的代码里的。如果想改变页面的样子,就行需要修改 Python 代码,这样很不方便。 Django 提供了模板系统,只要创建一个视图,就可以将页面的设计从代码中分离出来。

Django 做为一个 Web 框架,采用了模板来动态生成 HTML。模板包含所需 HTML 输出的静态部分以及一些描述如何插入动态内容的特殊语法。

一个 Django 项目可以配置一个或多个模板引擎。Django 为自己的模板系统(创造性地称为 Django 模板语言 (DTL))和流行的替代方案 Jinja2 提供了内置后端。其他模板语言的后端可从第三方获得。

Django 定义了一个标准的 API,用于加载和渲染模板,与后端无关。加载包括查找给定标识符的模板并对其进行预处理,通常将其编译为内存中的表示形式。渲染意味着用上下文数据插入模板并返回结果字符串。

Django 模板语言是 Django 自己的模板系统。推荐使用 DTL。由于历史原因,对模板引擎的通用支持和 Django 模板语言的实现都位于 django.template 命名空间中。

创建模板template

在 mysite 目录下创建 templates 目录,并添加 index.html 文件,目录结构如下:

Python Django Web 框架编程 - 模板 templates

为了让 Django 模板引擎能够找到 templates 路径,需要在 mysite/settings.py 文件中的 templates 节点,设置DIRS 内容。DIRS 定义了一个目录列表,引擎应该在其中按搜索顺序查找模板源文件。在下图中设置了 templates 路径在项目的根目录下。

Python Django Web 框架编程 - 模板 templates

Django 模板语言

Django 模板只是使用 Django 模板语言标记的文本文档或 Python 字符串。一些构造被模板引擎识别和解释。主要的是变量和标签。

使用上下文呈现模板。渲染用它们的值替换变量,这些值在上下文中查找,并执行标签。其他一切都按原样输出。

Django 模板语言的语法涉及四个部分:

变量

变量从上下文中输出一个值,它是一个类似字典的对象,将键映射到值。

变量被 {{ 和 }} 包围,如下所示:

My first name is {{ first_name }}. My last name is {{ last_name }}.           

使用 {'first_name': 'John', 'last_name': 'Doe'} 的上下文,此模板呈现为:

My first name is John. My last name is Doe.           

字典查找、属性查找和列表索引查找是用点符号实现的:

{{ my_dict.key }}
{{ my_object.attribute }}
{{ my_list.0 }}           

标签

标签在渲染过程中提供任意逻辑。这个定义故意含糊不清。例如,标签可以输出内容,用作控制结构,例如“if”语句或“for”循环,从数据库中获取内容,甚至启用对其他模板标签的访问。

标签被 {% 和 %} 包围,如下所示:

{% csrf_token %}           

一些标签需要开始和结束标签:

{% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %}           

过滤器

过滤器转换变量和标签参数的值。它们看起来像这样:

{{ django|title }}           

使用 {'django': 'the web framework for perfectionists with deadlines'} 的上下文,此模板呈现为:

The Web Framework For Perfectionists With Deadlines           

一些过滤器接受一个参数:

{{ my_date|date:"Y-m-d" }}           

使用模板语言变量输出动态内容到页面

在模板文件 index.html 中输入下列内容:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
   <h1>{{ title }}</h1>
		        <div>My first name is {{ first_name }}. My last name is {{ last_name }}.</div>
</body>
</html>           

其中 title,first_name,last_name 都是变量。需要从 view 中传递变量的值过来。

那么就需要对 polls/views.py 的 index() 进行修改。这里就需要用到 render 对模板进行数据渲染:

from django.shortcuts import render

#通过模板语言的变量进行传递信息
def index(request):
    context = {'title':'我的站点' ,'first_name': '乙丙', 'last_name': '白'}
    return render(request, 'index.html', context)           

保存之后。在浏览器中访问:http://127.0.0.1:8000/polls/。可以看到如下界面内容:

Python Django Web 框架编程 - 模板 templates