二十五岁时我们都一样愚蠢、多愁善感,喜欢故弄玄虚,可如果不那样的话,五十岁时也就不会如此明智。
标题:Django模板系统
Django可以将python和HTML分开,python进入视图,HTML进入模板。为了链接这两者,Django依赖于渲染函数和Django模板语言。
渲染功能
该功能需要三个参数 -
请求 - 初始请求。
模板的路径 - 这是项目settings.py变量中相对于TEMPLATE_DIRS选项的路径。
参数字典 - 包含模板中所需的所有变量的字典。可以创建此变量,也可以使用locals()传递视图中声明的所有局部变量。
Django模板语言(DTL)
Django的模板引擎提供了一种迷你语言来定义应用程序的面向用户的层。
显示变量
变量如下所示:{{variable}}。该模板将由渲染函数的第三个参数中的视图发送的变量替换该变量。让我们更改我们的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}} - 转义字符串内容,然后将换行符转换为标记。
您也可以设置变量的默认值。
标签
标签可以让你执行以下操作:if条件,for循环,模板继承等等。
标记如果
就像在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'标签,其工作方式与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时,我们仍然会得到与以前相同的结果,但现在我们依靠扩展和阻止来重构我们的代码 -
在main_template.html中,我们使用标记块定义块。标题栏将包含页面标题,内容块将包含页面主要内容。在home.html中,我们使用extends从main_template.html继承,然后填充上面的块定义(内容和标题)。
评论标签
comment标签有助于将注释定义到模板中,而不是HTML注释,它们不会出现在HTML页面中。它可以用于文档或仅评论一行代码。