Django框架之模版常用标签详解

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

其他常用标签

其实django官方提供了不只iffor这样的模板标签,还提供了很多可以让我们在模板页面上实现之前只能在后台进行逻辑实现的功能标签。

comment 标签

comment标签常用来注释,在{% comment %}{% endcomment %}中间的部分内容会被忽略;

这个标签不能嵌套使用

{% comment %}
	这里的内容会被忽略,相当于注释起来。
{% endcomment %}

autoescape 标签

默认情况下,为了安全起见,模板在接收到一个HTML标签或者css样式等具有实际意义的变量字符串时;

会对他进行转义,不会将这个字符串处理为HTML中实际的标签。一个<h1>标签到最后会被处理成:&lt;h1&gt;,这样浏览器就不会把他解释成一个标签的样式了

  • 转义规则
符号转义规则
<&lt;
>&gt;
'(单引号)&#39;
"(双引号)&quot;
&&amp;

那么有的时候,我们可能需要这样类似的HTML标签真正效果展示出来,比如一个<h1>标签我们希望他真正展示出h1的样子,而不是一个朴素的<h1>字符串,那么就需要我们使用autoescape标签来进行防止转义处理

str_ = "<h1>这是H1标签</h1>"
{% autoescape on %}
    {{ str_ }}
{% endautoescape %}
{% autoescape off %}
    {{ str_ }}
{% endautoescape %}

cycle 标签

cycle标签提供一些可迭代数据;它的结构像是一个环,其中的数据通过空格分割,你可以使用任意数量的值,作为接下里每一次循环迭代的数据。其他包含在单引号 '或者双引号 "中的值被认为是可迭代字符串,如果没有被字符串引号包围的值被当作模版变量

list_ = ['l','i','s','t'] # 视图定义的模板变量
<style>
    .red{
        color:red;
    }
    .blue{
        color:blue;
    }
</style>

{% for var in list_ %}
    <p class="{% cycle 'red' 'blue' %}">
        {{ var }}
    </p>
{% endfor %}

很简单的就可以通过cycle标签进行循环中的样式切换;循环遍历出来的列表中每一个字都是换着颜色展示

某些时候,我们可能希望在使用一次cycle之后,接下来使用不是继续向后迭代取值,而是继续沿用这一次取到的值,那么我们可以通过as语法给cycle标签取别名,在接下来需要沿用的地方直接使用别名作为模板变量即可,比如这样

{% for var in list_ %}
    <p>
        {% cycle 'red' 'blue' as style %}
    </p>
    <span>{{ style }}</span>
    <span>{{ style }}</span>
{% endfor %}

每一次循环取到的cycle其中的值,都可以通过别名style在这次循环区域中重复利用而不递进


但是我们发现个问题,as语句本身在使用时也会造成对cycle中的数据进行一次取值,那有什么办法可以在第一次as语句出现时,我只做声明,而不是为了取值,django模板中提供了一个叫silent的属性,可以用来as命名时不进行取值动作

{% cycle 'red' 'blue' as style silent %}
{% cycle 'red' 'blue' as style silent %}
<h1>{{ style }}</h1>
<h1>{{ style }}</h1>
{% cycle style %}
<h1>{{ style }}</h1>
{% cycle style %}
<h1>{{ style }}</h1>
<h1>{{ style }}</h1>

通过silent可以在初次定义时不进行取值,接下来使用cycle所创建的迭代器,每次访问得到当前值,不会继续向后迭代;

如果希望取到下一个值,可以使用迭代器标签{% cycle style %},这次访问不会生产数据,但是会让迭代访问位置向后推进一次,在接下来{{ style }}使用将得到下一个值

red
red
blue
red
red

ifchanged 标签

ifchanged标签用在for标签中;检测这一次迭代的值和上一次迭代的值是否有改变,可以搭配else标签使用,用来确定是没有改变;检查标签{% ifchanged %}{% endifchanged %}之间的数据在每一次迭代过程中是否发生改变

list_ = [1,1,1,2,3]
{% for var in list_ %}
	{% ifchanged %} 
		{{ var }}
	{% else %}
		数据未发生变化
	{% endifchanged %}
	<br>
{% endfor %}
1 
数据未发生变化 
数据未发生变化 
2 
3 

firstof 标签

firstof标签用来查找到标签内变量中第一个为True的参数并输出,如果标签内变量均为False,那么输出空

{% firstof 0 0 0 0 0 "哈哈哈" %}
哈哈哈

ifequal 标签

ifequal标签接收两个变量,用来判断这两个值是否相等,如果相等,展示对应内容

{% ifequal 1 "1" %}
    <h3>两个值相等</h3>
{% else %} 
    <h3>两个值不等</h3>
{% endifequal %}
<br>
  • 这都不用想的,俩类型都不一样

ifnotequal 标签

ifequal的反义


now 标签

显示日期或时间,标签必须一个参数,用来指定当前时间日期的描述方式;输出最终格式与项目时区及语言设置有关。参数是一个描述字符串,比较多,记着常用的就行

u微妙,000000-999999
s秒,00-59
Z时区偏移量(UTC),单位为秒。-43200到43200
U自Unix 时间以来的秒数。1970年1月1日00:00:00 UTC
分钟
i分钟,00-59
小时
g12小时格式,1-12’
G24小时格式,00-23
h12小时格式,00-12
H24小时格式,00-23
O时区差值,单位小时,如:Asia/Shanghai时区:+0800
P当前几时几分,如:5:30 pm
f当前几时几分,不包含上下午标示,如:5:30
a小写字母:a.m.、p.m.
A大写字母:AM、PM
月份
b月份英文字母的前三个表示,均小写。如:“aug”
d这个月的第几天,01-31
j这个月的第几天,1-31
E当前时区月份英文单词全拼
F当前月份英文单词全拼
m第几月,01-12
M月份英文字母的前三个表示,首字母大写。如:“Aug”
n第几月,1-12
N美联社月份缩写,如:‘Jan.’,‘Feb.’,‘March’,‘May’
星期
D星期几的英文单词前三个表示,首字母大写,如:‘Fri’
l星期几的英文单词全拼,如:‘Friday’
w星期几的数字,0(星期日)-6(星期六)
WISO-8601周数,今年第几周
LBool值判断是否为闰年
y第几年两位数字,如:2018年,返回18
Y第几年,目前是:2018
Z今天是今年的第几天
其他
cISO 8601时间格式
e当前时区名称:CST(美国-6:00,澳大利亚+9:30,中国+8:00,古巴-4:00)
rRFC 5322格式化日期
S一个月的第几天的英文序数后缀:‘st’,‘nd’,‘rd’或’th’
t当前月份的天数:28-31
T当前时区
  • 选出你想表达的时间,比如年月日,那么可以这样
{% now "Y-m-d" %}
2019-03-26
  • 除了以上自己组合的格式化字符,还有一些已经预定义好的字符串
字符串对应格式 时间
DATE_FORMAT‘N j, Y’ Feb. 5, 2018
DATETIME_FORMAT‘N j, Y, P’ Feb. 4, 2013, 4 p.m.
SHORT_DATE_FORMAT‘m/d/Y’ 12/31/2015
SHORT_DATETIME_FORMAT‘m/d/Y P’ 12/31/2019 11:59 p.m.
<ul>
    <li>DATE_FORMAT: {% now "DATE_FORMAT" %}</li>
    <li>DATETIME_FORMAT: {% now "DATETIME_FORMAT" %}</li>
    <li>SHORT_DATE_FORMAT: {% now "SHORT_DATE_FORMAT" %}</li>
    <li>SHORT_DATETIME_FORMAT: {% now "SHORT_DATETIME_FORMAT" %}</li>
</ul>
DATE_FORMAT: March 26, 2019
DATETIME_FORMAT: March 26, 2019, 3:45 a.m.
SHORT_DATE_FORMAT: 03/26/2019
SHORT_DATETIME_FORMAT: 03/26/2019 3:45 a.m.

最后now标签也支持as的用法,可以方便我们在模板中使用一个已经格式化好的输出

{% now "Y-m-d H:i:s" as show_time %}
<p>{{ show_time }}</p>

发现时间输出不正确,记得查看settings文件下的TIME_ZONE配置

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李恩泽的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值