这一篇教程,我们继续了解Django中模板的使用。
主要内容如下:
内置标签和过滤器;
模板中使用循环;
模板中添加条件判断。
一、内置标签和过滤器
Django中有很多的内置标签,例如之前已经使用的block和extends。
关于内置标签,大家可以通过官方文档进行了解。
在官方文档的页面中,除了内置模板标签,还有过滤器。
过滤器实际上就是一些函数,帮助我们进行数据的处理。
我们可以通过管道符“
”使用过滤器,格式为“{{变量
过滤器1
过滤器2}}”。
我们来做个练习,试用几个过滤器。
首先,我们在视图中先添加一个视图函数。
在视图函数中,我们添加两项数据和页面内容进行整合。
示例代码:
deffiter_test(request):
returnrender(request,filter.html,{letters:abc,number:1})
然后,我们添加URL分发配置。
示例代码:
path(filter/,siteviews.fiter_test),
最后,我们创建一个模板文件’filter.html’,在模板文件中我们使用过滤器对数据进行处理。
示例代码:
!DOCTYPEhtml
html
head
metacharset=UTF-8
title过滤器/title
/head
body
{{letters
length}}br
{{letters
upper}}br
{{letters
join:,}}br
{{number
add:1}}br
{{number
add:-1}}br
/body
/html
在模板代码中,我们通过过滤器对字符串‘letters’分别进行了长度获取、转为大写以及逗号分隔的操作;对数字“number”分别进行了加1和减1的操作。
页面显示结果:
二、模板中使用循环
在一个模板页面中添加单个数据可以通过“{{变量名}}”的方式来实现。
如果需要添加多个数据,则可以通过字典来实现。
例如,视图中向模板页面传入的数据为字典(例如:{‘person’:{‘name’:’小楼’,’sex’:’男’}}),在模板中则可以通过“{{person.name}}”和“{{person.sex}}”获取到相应的数据。
但是,如果页面中我们需要呈现一个列表(例如新闻列表),这时会有大量的数据需要处理,该如何实现呢?
另外,如果列表中有个别的项需要处理(例如第一项为红色字体),如何处理呢?
这些需求的实现,需要在模板中使用循环和条件判断。
如果有新闻列表内容的话,我们需要能够在页面中呈现出来。
这就需要在视图函数中获取一个新闻列表的数据内容,并在模板中循环加载出每一个列表项。
因为,我们还没有接触过模型(Model),暂时还不能和数据库进行关联,在这里我们先手动写出一个新闻列表的内容数据。
1、定义视图函数
在之前编写好的视图函数中,我们写出一个新闻列表内容,然后整合到模板定义的页面内容中。
此处只以经济新闻为例。
示例代码:
defnews_list(request,news_type):
news_dict={economic:经济,sport:体育}
news_titles=[]
ifnews_type==economic:
news_titles=[(12/5,作者成为全国首富。),(12/4,作者成为全省首富。),
(12/3,作者成为全市首富。),(12/2,作者成为镇里首富。),(12/1,作者成为村里首富。)]
returnrender(request,news_list.html,{news_type:news_dict[news_type],news_titles:news_titles})
2、模板中添加循环
示例代码:
{%extendsbase.html%}
{%blocktitle%}{{news_type}}新闻{%endblock%}
{%blockcontent%}
{{news_type}}新闻列表:
ul
{%fordate,titleinnews_titles%}
li{{title}}({{date}})/li
{%endfor%}
/ul
{%endblock%}
注意,模板中的循环是由“{%for变量in可迭代对象%}”和循环的内容以及“{%endfor%}”组成。
当我们完成上方代码之后,访问经济新闻列表页面,就能看到想要的效果了。
三、模板中添加条件判断
通过添加循环的代码,我们也能够看出,在模板中添加逻辑代码其实非常简单,只要了解添加的规则和能够使用的功能就可以了。
接下来,我们就尝试将新闻列表第一项的用红色字体显示。
示例代码:
{%extendsbase.html%}
{%blocktitle%}{{news_type}}新闻{%endblock%}
{%blockcontent%}
{{news_type}}新闻列表:
ul
{%fordate,titleinnews_titles%}
{%ifforloop.first%}
lifontcolor=red{{title}}/font({{date}})/li
{%endif%}
li{{title}}({{date}})/li
{%endfor%}
/ul
{%endblock%}
上方代码中,绿色部分是新增的代码。
通过条件判断,如果是循环第一项“forloop.first”,将“{{title}}”的内容用“font”标签变为红色字体。
“forloop.first”是循环的一个变量,像这样的变量还有其他几个。
在PyCharm中,我们输入“forloop.”之后,就能够看到这些变量。
当我们写完“if”的语句块之后,不要忘了在最后添加“{%endif%}”。
不管是“for”还是“if”,在模板中他们都是标签,需要有开始标签和结束标签。
以上是我们对列表内容的一些处理。
不过,有时列表中没有内容的话,我们也需要进行处理。
在之前的示例中,不管是体育新闻还是经济新闻,我们都用的同一模板。
体育新闻,我们并没有任何列表数据,这时需要给用户一个提示。
那么,如何判断数据内容是空的,并给出相应提示呢?
示例代码:
{%extendsbase.html%}
{%blocktitle%}{{news_type}}新闻{%endblock%}
{%blockcontent%}
{{news_type}}新闻列表:
ul
{%fordate,titleinnews_titles%}
{%ifforloop.first%}
lifontcolor=red{{title}}/font({{date}})/li
{%endif%}
li{{title}}({{date}})/li
{%empty%}
抱歉:暂时没有新闻内容!
{%endfor%}
/ul
{%endblock%}
上方代码中,绿色部分是新增内容。
通过在for循环中添加“{%empty%}”,就能够对数据内容为空进行判断,从而给出相应提示。
当我们完成本篇教程的所有代码,再次启动开发服务器,访问经济新闻列表和体育新闻列表,就能够看到我们想要的结果了。
经济新闻页面:
体育新闻页面:
本节练习源代码: