【django学习-10】模板2:内置标签与过滤器

  • 一:标签是对模板上下文控制输出,它是以{% tag %}表示的,其中tag是标签的名称,Django内置了许多内置标签,内置标签可以在Django源码(\django\template\defaulttags.py)中找到定义过程,下面我们列举场景的内置标签:
    • {% for %} 遍历输出上下文的内容
    • {% if %} 对上下文进行条件判断
    • {% crsf_token %} 生成crsf_token标签,用于防护跨站请求伪造攻击
    • {% url %} 引用路由配置的地址,生成响应的路由地址
    • {% with %} 将上下文名 重新命名
    • {% load %} 加载导入Django的标签库
    • {% static %} 读取静态资源的文件内容
    • {% extends xxx %} 模板继承
    • {% block xxx %} 重新父类模板的代码
#{% if %},{% for %} 
{#    注意点:标签中使用变量不需要加双括号 #}
    {% if num >= 100 %}
        {{ num }}
     {% elif num < 100 %}
        <h2>小于100</h2>
    {% endif %}

#{% crsf_token %}      生成crsf_token标签,用于防护跨站请求伪造攻击
前文中,提到过当我们提交form表单的时候,会报403,解决方法是注释setting中的中间件,这是躲避安全的措施,不可取。
用于生成csrf_token的标签,用于防治跨站攻击验证,其实,这里是会生成一个input标签,和其他表单标签一起提交给后台的。

<form action="/login/" method="post">
    <input type="text" name="username">
    <input type="password" name="pwd">
    <input type="submit" value="submit">
    {% csrf_token %}
</form>
此时我们打开login页面,F12查看--可以看到请求参数中有一个csrf_token参数,传给后台
csrfmiddlewaretoken: ZNLDhI8ziwmaERYovVSasJkc86BhMggjidLSDelyRby9jNBUHUG5Hf2TbZTRBzGB

#{% with %}:用更简单的变量名替代复杂的变量名
{% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}

#在for标签模板中,模板还提供了一些特殊的变量来获取for标签的循环信息
forloop.counter: 表示循环的次数。这个属性的值从 1 开始,因此第一次循环时,forloop.counter 等于 1 。
forloop.counter0: forloop.counter0 与 forloop.counter 类似,不过是从零开始的。第一次循环时,其值为 0 。
forloop.revcounter:forloop.revcounter的值是一个整数,表示循环中剩余的元素数量。第一次循环时, forloop.revcounter 的值是序列中要遍历的元素总数。最后一次循环时, forloop.revcounter的值为 1 。
forloop.revcounter0:forloop.revcounter0 与 forloop.revcounter类似,不过索引是基于零的。第一次循环时, forloop.revcounter0的值是序列中元素数量减去一。最后一次循环时, forloop.revcounter0 的值为 0 。
forloop.first:forloop.first 是个布尔值,第一次循环时为 True 。需要特殊处理第一个元素时很方便
forloop.last:forloop.last是个布尔值,最后一次循环时为True 。经常用它在一组链接之间放置管道符号:
forloop.parentloop:在嵌套的循环中, forloop.parentloop引用父级循环的 forloop 对象

L= [1,22,333,4444,55555]
{% for i in L %}
    {% if forloop.counter == 1 %}
        <span>这是第一次循环</span>
        <br>
    {% elif forloop.last %}
        <span>这是最后一次循环</span>
        <br>
    {% else %}
        <span>本次循环次数为:{{ forloop.counter }},列表元素值为:{{ i }}</span>
        <br>
    {% endif %}
{% endfor %}

  • 二:过滤器主要对上下文进行操作,如替换、反转等,基础语法 {{obj|filter:param}}
    • 单个上下文,支持多个过滤器同时使用,{{obj|filter1| fitter2}}
    • 过滤器可以传入参数,但是最多一个,带参数的过滤器与参数使用冒号隔开,并且两者之间不能留空格
    • Django内置过滤器可以在源码(\django\template\defaultfilters.py)里找到具体的定义。
常用过滤器:
 # 1  add          :   给变量加上相应的值
 # 2  addslashes   :    给变量中的引号前加上斜线
 # 3  capfirst     :    首字母大写
 # 4  cut          :   从字符串中移除指定的字符
 # 5  date         :   格式化日期字符串
 # 6  default      :   如果值是False,就替换成设置的默认值,否则就是用本来的值
 # 7  default_if_none:  如果值是None,就替换成设置的默认值,否则就使用本来的值

重点:safe--开启HTML转义、数据含有html标签,自动转化成相应的网页效果
{{ html|safe }}

{% autoescape off %}
  {{ html }}
{% endautoescape %}

posted @ 2022-09-07 22:14  Tony_xiao  阅读(48)  评论(0编辑  收藏  举报