Django 模板系统

Django 模板系统

Django使得将python代码和HTML代码分离成为可能,python代码放在视图中,HTML代码放在模板中。为了连接两者,Django依赖于render函数和Django模板语言。

render函数

这个函数接受三个参数 –

  • Request - 初始请求。

  • 模板路径 - 相对于项目中的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}} −转义字符串内容,然后将换行符转换为标签。

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

标签

标签允许您执行以下操作:如果条件,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

块和扩展标签

一个模板系统如果没有模板继承,就不完整。这意味着在设计模板时,你应该有一个主模板,其中包含孩子模板根据自己的需要填充的空白处,比如页面可能需要一个特殊的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标签定义块。标题块包含页面标题,内容块包含页面主要内容。在home.html中,我们使用extends从main_template.html继承,然后填充上述块(内容和标题)。

注释标签

注释标签用于在模板中定义注释,不是HTML注释,它们不会出现在HTML页面中。它可以用于文档或只是评论一行代码。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程