python123app_Python学习第123天(Django回头看:模板控制语句、filter、simple_tag)

紧接着昨天的内容,今天我们来说说模板语句的内容,关于模板语句,核心就是{ % 语句 % }

先说一下if  else的使用

{ % if 判定语句 % } { % endif % }

如果判定结果为true,则会执行其判定语句之后的html标签内容:

例子:

{% if num >= 100 and 8 %}

{% if num > 200 %}

num大于200

{% else %}

num大于100小于200

{% endif %}

{% elif num < 100%}

num小于100

{% else %}

num等于100

{% endif %}

{% if %} 标签接受and,or或者not来测试多个变量值或者否定一个给定的变量

{% if %} 标签不允许同一标签里同时出现and和or,否则逻辑容易产生歧义,例如下面的标签是不合法的:

{% if obj1 and obj2 or obj3 %}

总的来说,和我们Python中的if else完全相同

下面是for循环

{ % for % } { % endfor % }

每次循环模板系统都会渲染{% for %}和{% endfor %}之间的所有内容

例子:

  • {% for obj in list %}
  • {{ obj.name }}{% endfor %}
#在标签里添加reversed来反序循环列表:

{% for obj in list reversed %}

...

{% endfor %}

#{% for %}标签可以嵌套:

{% for country in countries %}

{{ country.name }}

  • {% for city in country.city_list %}
  • {{ city }}{% endfor %}
{% endfor %}

#系统不支持中断循环,系统也不支持continue语句,{% for %}标签内置了一个forloop模板变量,

#这个变量含有一些属性可以提供给你一些关于循环的信息1,forloop.counter表示循环的次数,它从1开始计数,第一次循环设为1:

{% for item in todo_list %}

{{ forloop.counter }}: {{ item }}

{% endfor %}2,forloop.counter0 类似于forloop.counter,但它是从0开始计数,第一次循环设为03,forloop.revcounter4,forloop.revcounter05,forloop.first当第一次循环时值为True,在特别情况下很有用:

{% for object in objects %}

{% if forloop.first %}

{% else %}{% endif %}

{{object}}

{% endfor %}

# 富有魔力的forloop变量只能在循环中得到,当模板解析器到达{% endfor %}时forloop就消失了

# 如果你的模板context已经包含一个叫forloop的变量,Django会用{% for %}标签替代它

# Django会在for标签的块中覆盖你定义的forloop变量的值

# 在其他非循环的地方,你的forloop变量仍然可用

#{% empty %}

{{li }}

{% for i in li %}

{{ forloop.counter0 }}----{{ i }}{% empty %}this is empty!{% endfor %}

其中涉及到empty,如果该循环为空,则empty下面的html标签进行执行,多用于提示搜索为空,我们制定搜索的过程中,往往反馈一个列表,我们通过遍历裂变,但部分时候也可能搜索结果为空,此时就可以通过empty进行反馈

而forloop.counter和 foeloop.revcounter则可以显示在模板语言中被隐藏掉的序号,后面加上0就是包括0的情况,不写则从1开始计算

forloop.first则用于给第一个特殊标识,比如遍历文章,给题目一个特殊的标识

csrf_token标签:这个标签很重要,保证了我们反馈的信息内容路劲是反馈给我们文件的信息路径

在form标签内增加{%csrf_token%}

该标签可以生成特殊识别代码,只有保证与后端第一次反馈过去的标签一致,才能接收到所提供的的数据,以保证数据不会被提交至其他的位置。

例子

{%csrf_token%}

{% with %}:用更简单的变量名替代复杂的变量名

不多说,很方便,减少你写的长度:

{% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}

{% verbatim %}: 禁止render

是这部分不被渲染,正常显示大括号

{% verbatim %}

{{ hello }}

{% endverbatim %}

下面就到了关键部分了,自定义filter和simple_tag

filter是单个参数的函数,而simple_tag则可以使用多个参数,但是前者需要{ 参数|函数:参数 }的方式,simple_tag不需要,其使用{ { 函数名 参数1 参数2 参数3.。。 } }参数之间通过逗号分开

使用方法:

1、在app中创建templatetags模块(必须的)

2、创建任意 .py 文件,如:my_tags.py

该文件前端有固定格式

fromdjango import templatefromdjango.utils.safestring import mark_safe

register= template.Library()

@register.filter 以上为固定格式

def filter_multi(v1,v2):

return v1 * v2

@register.simple_tag

def simple_tag_multi(v1,v2):

return v1 * v2

@register.simple_tag

def my_input(id,arg):

result = "" %(id,arg,)

return mark_safe(result)

3、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py :{% load my_tags %}

4、使用simple_tag和filter(如何调用)

-------------------------------.html

{% load xxx %} #首行

# num=12{{ num|filter_multi:2 }} #24{{ num|filter_multi:"[22,333,4444]"}}

{% simple_tag_multi 2 5 %} 参数不限,但不能放在if for语句中

{% simple_tag_multi num 5 %}

5、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.

特别注意:filter可以用在if等语句后,simple_tag不可以

{% if num|filter_multi:30 > 100 %}

{{ num|filter_multi:30}}

{% endif %}

以上为今日内容,复习完毕。切记在settings中的INSTALLED_APPS配置当前app

原文地址:https://www.cnblogs.com/xiaoyaotx/p/13258325.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值