Django可以分离python和HTML,python进入视图,HTML进入模板.为了链接这两者,Django依赖于渲染函数和Django模板语言.
渲染函数
这个函数有三个参数 :
请求 : 初始请求.
模板的路径 : 这是相对于项目settings.py变量中的TEMPLATE_DIRS选项的路径.
参数字典 : 包含模板中所需的所有变量的字典.可以创建此变量,也可以使用locals()传递视图中声明的所有局部变量.
Django模板语言(DTL) )
Django的模板引擎提供了一种迷你语言来定义应用程序的面向用户层.
显示变量
变量如下所示:{{variable}}.模板通过render函数的第三个参数中的视图发送的变量替换变量.让我们更改我们的hello.html以显示今天的日期和减号;
hello.html
Hello World!!!Today is {{today}}
然后我们的视图将更改为 :
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循环,模板继承等.
标记if
就像在Python中一样,你可以在模板中使用if,else和elif :
Hello World!!!Today is {{today}}
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%}
在这个新模板中,根据当天的日期,模板将呈现一定的值.
标记为
就像'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}} :
Hello World!!!Today is {{today}}
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%}{% for day in days_of_week %} {{day}}
{% endfor %}
我们应该得到类似 :
Hello World!!!Today is Sept. 11, 2015We are I don't know.MonTueWedThuFriSatSun
阻止和扩展标记
没有模板继承,模板系统就无法完成.这意味着在设计模板时,您应该有一个带有孔的主模板,孩子的模板将根据自己的需要填充,例如页面可能需要为所选选项卡提供特殊的CSS.
让我们将hello.html模板更改为从main_template.html继承.
main_template.html
{% block title %}Page Title{% endblock %} {% block content %} Body content {% endblock %}
hello.html
{% extends "main_template.html" %}{% block title %}My Hello Page{% endblock %}{% block content %}Hello World!!!Today is {{today}}
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%}{% for day in days_of_week %} {{day}}
{% endfor %}{% endblock %}
在上面的示例中,在调用/myapp/时你好我们仍然会得到与以前相同的结果,但现在我们依靠extends和block来重构我们的代码 :
在main_template.html中,我们使用标记块定义块.标题栏将包含页面标题,内容块将包含页面主要内容.在home.html中,我们使用extends从main_template.html继承,然后填写上面的块定义(内容和标题).
注释标记
评论标记有助于将注释定义到模板中,而不是HTML注释,它们不会出现在HTML页面中.它可用于文档或只是注释一行代码.