- Django 基本概念
- Django - 首页
- Django - 基础
- Django - 概述
- Django - 环境搭建
- Django - 创建项目
- Django - 应用生命周期
- Django - 创建视图
- Django - URL 路由
- Django - 首页页面
- Django - 模板系统
- Django - MVT
- Django - 添加主模板
- Django Admin 后台管理
- Django Admin - 界面
- Django Admin - 创建用户
- Django Admin - 添加模型
- Django Admin - 设置显示字段
- Django Admin - 更新对象
- Django 模型
- Django - 模型
- Django - 插入数据
- Django - 更新数据
- Django - 删除数据
- Django - 更新模型
- Django 静态文件
- Django - 添加静态文件
- Django - 添加 CSS 文件
- Django 高级应用
- Django - 404 页面未找到
- Django - 页面重定向
- Django - 发送邮件
- Django - 通用视图
- Django - 表单处理
- Django - 文件上传
- Django - Apache 配置
- Django - Cookie 处理
- Django - Session 会话
- Django - 缓存
- Django - 评论
- Django - RSS
- Django - AJAX
- Django 资源推荐
- Django - 快速指南
- Django - 资源推荐
- Django - 讨论
Django - 模板系统
Django 允许分离 Python 和 HTML 代码,Python 代码位于视图中,HTML 代码位于模板中。为了连接两者,Django 依赖于 render 函数和 Django 模板语言。
Render 函数
此函数接受三个参数:
请求 - 初始请求。
模板路径 - 这是相对于项目 settings.py 文件中 TEMPLATE_DIRS 选项的相对路径。
参数字典 - 包含模板中所需所有变量的字典。您可以创建此变量,也可以使用 locals() 传递在视图中声明的所有局部变量。
Django 模板语言 (DTL)
Django 的模板引擎提供了一种小型语言来定义应用程序的用户界面层。
显示变量
变量形式如下:{{variable}}。模板会将变量替换为视图在 render 函数的第三个参数中发送的变量。让我们修改 hello.html 来显示今天的日期:
hello.html
<html>
<body>
Hello World!!!<p>Today is {{today}}</p>
</body>
</html>
然后我们的视图将更改为:
def hello(request):
today = datetime.datetime.now().date()
return render(request, "hello.html", {"today" : today})
访问 URL /myapp/hello 后,我们将获得以下输出:
Hello World!!! Today is Sept. 11, 2015
您可能已经注意到,如果变量不是字符串,Django 将使用 __str__ 方法来显示它;同样,您可以像在 Python 中一样访问对象属性。例如:如果要显示日期年份,我的变量将是:{{today.year}}。
过滤器
它们帮助您在显示时修改变量。过滤器的结构如下:{{var|filters}}。
一些例子:
{{string|truncatewords:80}} - 此过滤器将截断字符串,您将只看到前 80 个单词。
{{string|lower}} - 将字符串转换为小写。
{{string|escape|linebreaks}} - 转义字符串内容,然后将换行符转换为标签。
您还可以为变量设置默认值。
标签
标签允许您执行以下操作:if 条件语句,for 循环,模板继承等等。
if 标签
就像在 Python 中一样,您可以在模板中使用 if、else 和 elif:
<html>
<body>
Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}
the first day of month.
{% elif today.day == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
</body>
</html>
在这个新的模板中,根据一天中的日期,模板将呈现某个值。
for 标签
就像 'if' 一样,我们有 'for' 标签,它的工作方式与 Python 中完全相同。让我们更改 hello 视图以将列表传输到我们的模板:
def hello(request):
today = datetime.datetime.now().date()
daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
return render(request, "hello.html", {"today" : today, "days_of_week" : daysOfWeek})
使用 {{ for }} 显示该列表的模板:
<html>
<body>
Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}
the first day of month.
{% elif today.day == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
<p>
{% for day in days_of_week %}
{{day}}
</p>
{% endfor %}
</body>
</html>
我们应该得到类似这样的结果:
Hello World!!! Today is Sept. 11, 2015 We are I don't know. Mon Tue Wed Thu Fri Sat Sun
block 和 extend 标签
如果没有模板继承,模板系统将是不完整的。这意味着当您设计模板时,您应该有一个带有“空洞”的主模板,子模板将根据自己的需要填充这些“空洞”,例如,页面可能需要为选定的选项卡使用特殊的 CSS。
让我们更改 hello.html 模板以继承自 main_template.html。
main_template.html
<html>
<head>
<title>
{% block title %}Page Title{% endblock %}
</title>
</head>
<body>
{% block content %}
Body content
{% endblock %}
</body>
</html>
hello.html
{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% block content %}
Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}
the first day of month.
{% elif today.day == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
<p>
{% for day in days_of_week %}
{{day}}
</p>
{% endfor %}
{% endblock %}
在上面的例子中,调用 /myapp/hello 我们仍然会得到与之前相同的结果,但现在我们依赖于 extends 和 block 来重构我们的代码:
在 main_template.html 中,我们使用 block 标签定义块。title 块将包含页面标题,content 块将包含页面主要内容。在 home.html 中,我们使用 extends 继承自 main_template.html,然后我们填充上面定义的块(content 和 title)。
注释标签
注释标签有助于在模板中定义注释,而不是 HTML 注释,它们不会出现在 HTML 页面中。这对于文档编写或只是注释代码行很有用。