Django 模板系统

Django能够单独分开 Python 和 HTML,Python代码/变量进入视图和HTML模板。连接这两个,Django依赖于渲染函数和Django模板语言。

渲染函数

这个函数有三个参数−

请求− 初始化请求模板路径−这是相对于在项目 settings.py 文件的变量到 TEMPLATE_DIRS 选项的路径。参数字典−字典包含所需的模板中的所有变量。这个变量可以创建或者可以使用locals()通过在视图中声明的所有局部变量。

Django模板语言(DTL)

Django模板引擎提供了一个小型的语言来定义应用程序面向用户的层。

显示变量

变量显示如下:{{variable}}.模板由视图在渲染(render)函数的第三个参数发送的变量来替换变量。让我们改变 hello.html 显示当天的日期 :

hello.html

#Filename:example.py#Copyright:2020ByNhooo#Authorby:www.shangmayuan.com#Date:2020-08-08<html><body>HelloWorld!!!<p>Todayis{{today}}</p></body></html>

然后,我们的视图将改变为 -

#Filename:example.py#Copyright:2020ByNhooo#Authorby:www.shangmayuan.com#Date:2020-08-08defhello(request):today=datetime.datetime.now().date()returnrender(request,"hello.html",{"today":today})

现在,我们将得到下面的输出在访问URL/myapp/hello之后−

#Filename:example.py#Copyright:2020ByNhooo#Authorby:www.shangmayuan.com#Date:2020-08-08HelloWorld!!!TodayisSept.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在模板中−

#Filename:example.py#Copyright:2020ByNhooo#Authorby:www.shangmayuan.com#Date:2020-08-08<html><body>HelloWorld!!!<p>Todayis{{today}}</p>Weare{%iftoday.day==1%}thefirstdayofmonth.{%eliftoday==30%}thelastdayofmonth.{%else%}Idon'tknow.{%endif%}</body></html>

在这个新的模板,根据当天的日期,该模板将呈现这个值。

for标签

就像'if',我们有'for'标签,这些完全像在Python中一样使用它们。让我们改变hello视图列表发送到我们的模板−

#Filename:example.py#Copyright:2020ByNhooo#Authorby:www.shangmayuan.com#Date:2020-08-08defhello(request):today=datetime.datetime.now().date()daysOfWeek=['Mon','Tue','Wed','Thu','Fri','Sat','Sun']returnrender(request,"hello.html",{"today":today,"days_of_week":daysOfWeek})

该模板用来显示列表{{ for }} −

#Filename:example.py#Copyright:2020ByNhooo#Authorby:www.shangmayuan.com#Date:2020-08-08<html><body>HelloWorld!!!<p>Todayis{{today}}</p>Weare{%iftoday.day==1%}thefirstdayofmonth.{%eliftoday==30%}thelastdayofmonth.{%else%}Idon'tknow.{%endif%}<p>{%fordayindays_of_week%}{{day}}</p>{%endfor%}</body></html>

我们应该得到输出的内容如下−

#Filename:example.py#Copyright:2020ByNhooo#Authorby:www.shangmayuan.com#Date:2020-08-08HelloWorld!!!TodayisSept.11,2015WeareIdon'tknow.MonTueWedThuFriSatSun

块和扩展标签

模板系统是不完整模板继承。当您设计模板的含义,子模板会根据自己的需要填写一个主模板,就像一个页面中所选选项卡可能需要一个特殊的CSS。

让我们修改hello.html模板来从 main_template.html 继承。

main_template.html

#Filename:example.py#Copyright:2020ByNhooo#Authorby:www.shangmayuan.com#Date:2020-08-08<html><head><title>{%blocktitle%}PageTitle{%endblock%}</title></head><body>{%blockcontent%}Bodycontent{%endblock%}</body></html>

hello.html

#Filename:example.py#Copyright:2020ByNhooo#Authorby:www.shangmayuan.com#Date:2020-08-08{%extends"main_template.html"%}{%blocktitle%}MyHelloPage{%endblock%}{%blockcontent%}HelloWorld!!!<p>Todayis{{today}}</p>Weare{%iftoday.day==1%}thefirstdayofmonth.{%eliftoday==30%}thelastdayofmonth.{%else%}Idon'tknow.{%endif%}<p>{%fordayindays_of_week%}{{day}}</p>{%endfor%}{%endblock%}

在上面的示例,在调用 /myapp/hello,我们仍然会得到相同的结果和以前一样,但现在我们靠的是扩展,并不用重构代码-−

在 main_template.html 我们定义使用标签块。标题栏块将包含页面标题,以及内容块将在页面主内容。在Home.html中使用扩展继承来自main_template.html,那么我们使用上面块定义(内容和标题)。

注释标签

注释标签用来模板定义注释,不是HTML注释,它们将不会出现在HTML页面。它可以是一个文件或只是注释一行代码。

编辑于2024-05-20 20:23