ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Django模板语言-2:simple_tag和filter

2019-10-16 15:55:20  阅读:222  来源: 互联网

标签:结果 simple str1 register Django filter tag cycle


标签simple_tag:

    标签:在HTML中使用{% %}标记

    常见的系统内自带的标签:load、for 、if、with、csrf_token、verbatim、

    block-endblock\extends\comment-endcomment\cycle(silent)\自定义标签


    1、with:

        在html里给变量赋值

{% with name=obj.group.name%}        # 用于长变量赋值
{{name}}                           # 直接调ip,显示host.name.ip的值

    2、csrf_token:

        之前在使用form表单时,提示Forbidden:CSRF verification failed. Request aborted,

        解决方法1、在settings里注释掉中间件CSRF

        解决方法2、在form表单里添加csrf_token标签

<form action="checkuser/" method="post">
<input type="text" name="username" placeholder="用户名" />
<input type="text" name="password" placeholder="密码" />
<input type="submit" value="登 陆" />

{% csrf_token %} {#使用此句,无需注释掉中间件的CSRF#}       
</form>


    3、verbatim

        取消渲染模板标记,以文字显示verbatim里面的内容

{% verbatim %}
    {{ for i in [1,2,3,4] }}
    {{ i }}
    {{ endfor }}
{% endverbatim %}

网页显示结果:
 {{ for i in [1,2,3,4] }} {{ i }} {{ endfor }}

    4、autoescape、识别、不识别含有html标签的字符串,默认不识别html标签,与过滤器safe,django的mark_safe作用一样    

            参数:on、off,默认on

html_str = "<a href='f-t'>点我</a>"
{% autoescape off %}
    {{ html_str }}
{% endautoescape %}

# 结果:
点我

{% autoescape off %}
    {{ html_str }}
{% endautoescape %}

# 结果:
<a href='f-t'>点我</a>

    5、comment注释

{% comment %}
    此段内容不显示在网页上
{% endcomment %}

    6、cycle,循环迭代,重复1到4,遇到resetcycle,重新从1开始,silent使用上一个值

{% cycle '1' '2' '3' '4' as num%}
{% cycle num %}
{% cycle num silent %}        # 重复输出2
{% resetcycle %}
{% cycle num %}
{% cycle num %}
{% cycle num %}
{% cycle num %}

# 应用场景:隔行变色
{% for i in list%}
<tr class={% cycle 'blue' 'red' %}>lala</tr>
{%endfor%}

    7、debug输入调试信息

{% debug %}

    8、firstof    输入参数中,第一个不为空或false的参数

{% firstof  da  'e' 'f' %}
# 因为da是未定义的变量名,结果: 'e'



    9、自定义simple_tag:

        3固定原则:在APP中新建包名是固定:templatetags

                           在views中,Library实例化名字固定:register=template.Library()

                           自定义函数,使用register.simple_tag装饰

        使用:在HTML上方{% load 定义的python文件%}

# 在templatetags下新建python文件,custom_tag.py

# 导入template
from django import template

# 实例化
register = template.Library()        # register固定,不可变为其它名

@register.simple_tag                 # 装饰daxie
def daxie(str1):
    # 把字符串变成大写。
    str1 = str(str1).upper()    
    return str1
# 在HTML中上方载入自定义的python文件

{% load custom_tag %}
{% daxie 'WERWERFSEFkjdDFGSdfeflnnidhggindSDGSEGSFVBNHR' %}
# 参数直接写在simple_tag名字的后面,可以有多个

#结果#
WERWERFSEFKJDDFGSDFEFLNNIDHGGINDSDGSEGSFVBNHR

过滤器filter:

    支持链式操作,每个结果都依次传入下个|的过滤器

    过滤器调用格式{{ 值|过滤器名1:参数1|过滤器名2:参数2|...........}}

        说明:

                值:只能传一个

                管道符|:左右都不能带空格

                过滤器名:函数名

                :左右也不能带空格

                参数:也只能传一个,多个值可以使用加引号的字典或列表,"{'name':'david','age':19}"


    1、内置过滤器有30个:add\default\length\filesizeformat\slice\date\safe\truncatechars\truncatewords\cut\join\add\urlencode

# add 前值加
{{ 30|add:' 1'|add:' 3'|add:' 2'|add:' 4'|add:' 5' }}   # 多个|每次传递前面的值
# 结果:sq 1 3 2 4 5

# urlencode还记得javascript地址转换吗,一样样的
{{ "http://127.0.0.1:8000/a/test/666"|urlencode }}
结果:http%3A//127.0.0.1%3A8000/a/test/666

<br>
# join 使用指定字符连接列表或字符
# views传入{'ls':[122,111,555]}
{{ ls|join:'@' }}
结果:122@111@555

{{ '1    2232'|join:'-' }}
结果:1- - - - -2-2-3-2

<br>
# cut 从字符串中删除指定字符串
{{ '1112312312311221313'|cut:'23' }}
结果:1111111221313

<br>
# truncatechars从第n个字符删除
{{ '1234567890'|truncatechars:2 }}
结果:1...

<br>
# truncatewords 以空格计算单词个数,保留n个单词
{{ '123 456 78 90'|truncatewords:2 }}
结果:123 456 …

<br>
# safe变量值是安全的,使HTML字符串转义,link = "<p><a href='http://127.0.0.1:8000/a/test/666'>超链接</a> </p>"
{{ link }}
{#结果:<p><a href='http://127.0.0.1:8000/a/test/666'>超链接</a> </p>#}
{{ link|safe }}
结果:超链接

<br>
# date 格式化日期,传入的是datetime.datetime.now()
{{ dt|date:"Y-m-d H:i:s" }}
# 结果:2019-10-11 14:58:16
{{ dt|date }}
# 结果:Oct. 11, 2019

<br>
# slice切片:
{{ '0123456'|slice:"0:3" }}
# 结果:0123

<br>
# filesizeformat,将数值转换为计算机单位
{{ 1000|filesizeformat }}   # 1000 bytes
{{ 10000|filesizeformat }}  # 9.8 KB
{{ 1000000000|filesizeformat }} # 953.7 MB

<br>
# default 如果前面的变量为空或不存在,显示默认值,不改变sname的值
{{ sname|default:'none' }}
# 结果: none

<br>
# length 返回长度
{{ 'abc'|length }}


    2、自定义filter:

        定义方式与simple_tag一样,调用方式不一样。

        4固定原则:在APP中新建包名是固定:templatetags

                           在views中,Library实例化名字固定:register=template.Library()

                           HTML里调用格式固定

                           自定义函数,使用register.filter装饰

                           只能使用两个值,通常一个是修饰前,一个是修饰参数

        使用:在HTML上方{% load 定义的python文件%}

        调用:使用{{}}调用 ,格式:{{ str|filtername:args }}

# 在templatetags下新建python文件,custom_filter.py

from django import template                       # 导入template模块
register = template.Library()                      # 实例化,名字必须是register

@register.filter
def filter_ellipsis(str1, args1):         # 最多两个参数
    # 把str1截取args1长度并加...返回给前端
    if len(str1) > args1:
        str1 = str1[:args1] + r"..."
    return str1

        在HTML中上方载入自定义的python文件

{% load custom_tag %}
{{ "01234567890123456789012345678901234567890123456789"|filter_ellipsis:20 }}

# 结果:
01234567890123456789...



Filter与simple_tag区别:

    1、HTML标记不一样,filter使用{{}},tag使用{%%}

    2、filter可以在if/for里用于条件判断,tag不可以

    3、filter最多传两个参数,tag可以多个




标签:结果,simple,str1,register,Django,filter,tag,cycle
来源: https://blog.51cto.com/yishi/2442889

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有