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 页面中。这对于文档编写或只是注释代码行很有用。

广告
© . All rights reserved.