Django 简明教程

Django - Template System

Django 使得可以将 Python 和 HTML 分开,Python 用于视图,HTML 用于模板。为了将两者关联,Django 依靠 render 函数和 Django 模板语言。

The Render Function

此函数需要三个参数 −

  1. Request − 初始请求。

  2. The path to the template − 这是 project settings.py 变量中 TEMPLATE_DIRS 选项的相对路径。

  3. Dictionary of parameters − 包含模板中所需所有变量的字典。可以创建此变量,也可以使用 locals() 传递在视图中声明的所有局部变量。

Django Template Language (DTL)

Django 的模板引擎提供了一种迷你语言来定义应用程序面向用户的层。

Displaying Variables

变量看起来像这样:{{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 }}。

Filters

它们帮助您在显示时间修改变量。过滤器结构如下所示:{{ var|filters }}。

Some examples

  1. {{string|truncatewords:80}} − 该过滤器将截断字符串,因此您将只看到前 80 个单词。

  2. {{string|lower}} − 将字符串转换为小写。

  3. {{string|escape|linebreaks}} − 转义字符串内容,然后将换行符转换为标签。

您还可以设置变量的默认值。

Tags

标签允许您执行以下操作:if 条件、for 循环、模板继承等。

Tag 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>

在此新模板中,根据日期,模板将呈现特定值。

Tag 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 and Extend Tags

如果没有模板继承,模板系统将无法完成。也就是说,在设计模板时,应该有一个带有孔的主模板,子模板将根据其需要进行填充,就像一个页面可能需要一个特殊 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 继承,然后我们填充上述定义的块(内容和标题)。

Comment Tag

标签 comment 有助于在模板中定义注释,而不是 HTML 注释,它们不会显示在 HTML 页面中。它可以用来记录文档或仅仅注释一行代码。