zoukankan      html  css  js  c++  java
  • Django之过滤器

    Django 过滤器

     
    过滤器 描述 示例
    upper 以大写方式输出 {{ user.name | upper }}
    add 给value加上一个数值 {{ user.age | add:”5” }}
    addslashes 单引号加上转义号  
    capfirst 第一个字母大写 {{ ‘good’| capfirst }} 返回”Good”
    center 输出指定长度的字符串,把变量居中 {{ “abcd”| center:”50” }}
    cut 删除指定字符串 {{ “You are not a Englishman” | cut:”not” }}
    date 格式化日期  
    default 如果值不存在,则使用默认值代替 {{ value | default:”(N/A)” }}
    default_if_none 如果值为None, 则使用默认值代替  
    dictsort 按某字段排序,变量必须是一个dictionary {% for moment in moments | dictsort:”id” %}
    dictsortreversed 按某字段倒序排序,变量必须是dictionary  
    divisibleby 判断是否可以被数字整除
    {{ 224 | divisibleby:2 }}  返回 True
    escape 按HTML转义,比如将”<”转换为”&lt”  
    filesizeformat 增加数字的可读性,转换结果为13KB,89MB,3Bytes等
    {{ 1024 | filesizeformat }} 返回 1.0KB
    first 返回列表的第1个元素,变量必须是一个列表  
    floatformat 转换为指定精度的小数,默认保留1位小数 {{ 3.1415926 | floatformat:3 }} 返回 3.142  四舍五入
    get_digit 从个位数开始截取指定位置的数字 {{ 123456 | get_digit:’1’}}
    join 用指定分隔符连接列表 {{ [‘abc’,’45’] | join:’*’ }} 返回 abc*45
    length 返回列表中元素的个数或字符串长度  
    length_is 检查列表,字符串长度是否符合指定的值 {{ ‘hello’| length_is:’3’ }}
    linebreaks 用<p>或<br>标签包裹变量 {{ “Hi David”|linebreaks }} 返回<p>Hi</p><p>David</p>
    linebreaksbr 用<br/>标签代替换行符  
    linenumbers 为变量中的每一行加上行号  
    ljust 输出指定长度的字符串,变量左对齐 {{‘ab’|ljust:5}}返回 ‘ab   ’
    lower 字符串变小写  
    make_list 将字符串转换为列表  
    pluralize 根据数字确定是否输出英文复数符号  
    random 返回列表的随机一项  
    removetags 删除字符串中指定的HTML标记 {{value | removetags: “h1 h2”}}
    rjust 输出指定长度的字符串,变量右对齐  
    slice 切片操作, 返回列表 {{[3,9,1] | slice:’:2’}} 返回 [3,9]
    {{ 'asdikfjhihgie' | slice:':5' }} 返回 ‘asdik’
    slugify 在字符串中留下减号和下划线,其它符号删除,空格用减号替换
    {{ '5-2=3and5 2=3' | slugify }} 返回 5-23and5-23
    stringformat 字符串格式化,语法同python  
    time 返回日期的时间部分  
    timesince 以“到现在为止过了多长时间”显示时间变量 结果可能为 45days, 3 hours
    timeuntil 以“从现在开始到时间变量”还有多长时间显示时间变量  
    title 每个单词首字母大写  
    truncatewords 将字符串转换为省略表达方式
    {{ 'This is a pen' | truncatewords:2 }}返回
    This is ...
    truncatewords_html 同上,但保留其中的HTML标签
    {{ '<p>This is a pen</p>' | truncatewords:2 }}返回
    <p>This is ...</p>
    urlencode 将字符串中的特殊字符转换为url兼容表达方式 {{ ‘http://www.aaa.com/foo?a=b&b=c’ | urlencode}}
    urlize 将变量字符串中的url由纯文本变为链接  
    wordcount 返回变量字符串中的单词数  
    yesno 将布尔变量转换为字符串yes, no 或maybe
    {{ True | yesno }}
    {{ False | yesno }}
    {{ None | yesno }}
    返回 
    yes
    no 
    maybe

    自定义过滤器:

    第一步: 在app目录下创建包 templatetags

    在templatetags下创建py文件,文件名随意,比如

    自定义simple_tag, 不能在模板中使用if判断
    from django import template
    from django.utils.html import format_html
    import datetime
    
    register = template.Library()
    
    @register.simple_tag
    def page_cut(current_page, loop_page):
        #分页: 固定显示前后5页
        differ = abs(current_page - loop_page)
        if differ < 5:
            li = '''<li class=""><a href="?page=%s">%s<span class="sr-only">(current)</span></a></li>''' % (loop_page, loop_page)
            return format_html(li)
        else:
            #这里一定要返回一个空字符串,否则在前端会显示一系列的None
            return ''

    自定义过滤器函数filter

    因为sample_tag不能使用if判断,所以才有了它

    最多只能有两个参数,一个是变量值,一个是选项值

    from django import template
    from django.utils.html import format_html
    import datetime
    
    register = template.Library()
    
    @register.filter
    def time_color(exp_date):
        #给一个月内到期的html标签加上class属性
        startdate = datetime.datetime.now().date()
        enddate = startdate + datetime.timedelta(30)
        if (enddate - exp_date).days > 0 and (enddate - exp_date).days <= 30:
            td = '''<td class="%s">%s</td>''' % ('exp_date', exp_date)
            return format_html(td)
        elif (enddate - exp_date).days > 30:
            td = '''<td class="outof">%s</td>''' % (exp_date)
            return format_html(td)
        else:
            td = '''<td>%s</td>''' % (exp_date)
            return format_html(td)

    第二步,html引用

    在文件开头导入

    {% load my_page %}

    使用

    <tbody>
            {% for project in projects_list %}
            <tr>
                <td><a href="{% url 'projects_detail' project.id %}">{{ project.com_name }}</a></td>
                <td>{{ project.name}}</td>
                <td>{{ project.domain }}</td>
                <td>{{ project.get_status_display }}</td>
                {{ project.exp_date|time_color }}
                <td>{{ project.ftp }}</td>
            </tr>
            {% endfor %}
        </tbody>
    <!-- 页码导航 -->
    <nav>
      <ul class="pagination">
        {% if projects_list.has_previous %}
            <li class=""><a href="?page={{ projects_list.previous_page_number }}" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>
        {% endif %}
    
        {% for page_num in projects_list.paginator.page_range %}
         {% if page_num == projects_list.number %}
            <li class="active"><a href="?page={{ page_num }}">{{ page_num }}<span class="sr-only">(current)</span></a></li>
         {% else %}
             #分页标签
            {% page_cut projects_list.number page_num %}
         {% endif %}
        {% endfor %}
    
        {% if projects_list.has_next %}
            <li class=""><a href="?page={{ projects_list.next_page_number }}" aria-label="Previous"><span aria-hidden="true">&raquo;</span></a></li>
        {% endif %}
      </ul>
    </nav>

    总结:

    首先需要在每个应用下创建templatetags文件夹,django会自动遍历以它命名的文件夹找到自定义的过滤器
    然后书写脚本
    from django import template
    register = template.Library()

    1. @request.filter 变量过滤器(最多可以有两个参数)
    2. @request.simple_tag 标签过滤器(不限制)
    3. @request.inclusion_tag 标签过滤器(参数是一个页面)

    在页面中使用时的步骤
    1.{% load 脚本名 %}
    2.{% 方法名 参数 %}

  • 相关阅读:
    chromedriver版本对应支持的Chrome版本
    post请求,直接在地址后加请求参数,并将请求参数 url加密
    Requests 请求-重定向Location
    requests 进行https请求,一直报SSL 报错,以及 移除SSL认证后的InsecureRequestWarning警告解决
    fiddler 设置,只过滤固定域名的网址
    python requests库,请求返回 中文乱码问题的解决
    python post请求,application/x-www-form-urlencoded格式,提交数据key、val均需URL转码
    python post请求,text/xml 格式
    那些年找工作入过的坑! 避雷!!!!
    构建前端gulp自动化
  • 原文地址:https://www.cnblogs.com/qq631243523/p/10054218.html
Copyright © 2011-2022 走看看