- Django 教程
 - 姜戈 - 主页
 - Django - 基础知识
 - Django - 概述
 - Django - 环境
 - Django - 创建项目
 - Django - 应用程序生命周期
 - Django - 管理界面
 - Django - 创建视图
 - Django - URL 映射
 - Django - 模板系统
 - Django - 模型
 - Django - 页面重定向
 - Django - 发送电子邮件
 - Django - 通用视图
 - Django - 表单处理
 - Django - 文件上传
 - Django - Apache 设置
 - Django - Cookie 处理
 - Django - 会话
 - Django - 缓存
 - Django - 评论
 - 姜戈 - RSS
 - Django - AJAX
 
- Django 有用资源
 - Django - 快速指南
 - Django - 有用的资源
 - Django - 讨论
 
Django - 模板系统
Django 使得分离 python 和 HTML 成为可能,python 放在视图中,HTML 放在模板中。为了链接两者,Django 依赖于渲染函数和 Django 模板语言。
渲染函数
该函数采用三个参数 -
请求- 初始请求。
模板的路径- 这是相对于项目 settings.py 变量中的 TEMPLATE_DIRS 选项的路径。
参数字典- 包含模板中所需的所有变量的字典。可以创建此变量,也可以使用 locals() 传递视图中声明的所有局部变量。
Django 模板语言 (DTL)
Django 的模板引擎提供了一种迷你语言来定义应用程序面向用户的层。
显示变量
变量如下所示:{{variable}}。模板将渲染函数的第三个参数中的变量替换为视图发送的变量。让我们更改 hello.html 以显示今天的日期 -
你好.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 循环、模板继承等。
标记如果
就像在 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>
在这个新模板中,根据当天的日期,模板将呈现一定的值。
标记为
就像“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
块和扩展标签
如果没有模板继承,模板系统就不完整。这意味着当您设计模板时,您应该有一个带有孔的主模板,子模板将根据自己的需要填充这些孔,就像页面可能需要为所选选项卡使用特殊的 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>
你好.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 定义块。标题块将包含页面标题,内容块将包含页面主要内容。在 home.html 中,我们使用 extends 继承自 main_template.html,然后填充上面定义的块(内容和标题)。
评论标签
注释标签有助于将注释定义到模板中,而不是 HTML 注释,它们不会出现在 HTML 页面中。它对于文档或仅注释一行代码很有用。