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页面中。它可以用于文档或只是评论一行代码。