Django 简明教程
Django - Template System
Django 使得可以将 Python 和 HTML 分开,Python 用于视图,HTML 用于模板。为了将两者关联,Django 依靠 render 函数和 Django 模板语言。
The Render Function
此函数需要三个参数 −
-
Request − 初始请求。
-
The path to the template − 这是 project settings.py 变量中 TEMPLATE_DIRS 选项的相对路径。
-
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 −
-
{{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>
在此新模板中,根据日期,模板将呈现特定值。
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 继承,然后我们填充上述定义的块(内容和标题)。