当前位置: 首页 > 文档资料 > Django 入门教程 >

模板系统(Template System)

优质
小牛编辑
134浏览
2023-12-01

Django可以分离python和HTML,python进入视图,HTML进入模板。 为了链接这两者,Django依赖于渲染功能和Django模板语言。

渲染功能

这个功能有三个参数 -

  • Request - 初始请求。

  • The path to the template的路径 - 这是相对于项目settings.py变量中的TEMPLATE_DIRS选项的路径。

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

Django Template Language (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}}。

过滤器 (Filters)

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

Some examples -

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

  • {{string|lower}} - 将字符串转换为小写。

  • {{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>

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

标记为

就像'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中,我们使用标记块定义块。 标题栏将包含页面标题,内容块将包含页面主要内容。 在home.html中,我们使用extends从main_template.html继承,然后我们填充上面的块定义(内容和标题)。

评论标签

注释标记有助于将注释定义到模板中,而不是HTML注释,它们不会出现在HTML页面中。 它可用于文档或只是注释一行代码。