• django----过滤器和自定义标签


    模板语法之过滤器

    1、default:如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:

    <p>default过滤器:{{ li|default:"如果显示为空,设置的解释性的内容" }}</p>

    2、length:返回值的长度。它对字符串和列表都起作用。例如:

    {{ value|length }}    //如果 value 是 ['a', 'b', 'c', 'd'],那么输出是 4。

    3、filesizeformat:将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB''4.1 MB''102 bytes', 等等)。例如:

    {{ value|filesizeformat }}   //如果 value 是 123456789,输出将会是 117.7 MB

    4、date:如果 value=datetime.datetime.now()

    {{ value|date:"Y-m-d" }}  

    5、slice  :切片

    {{ value|slice:"2:-1" }}    //value="hello world"
    

    6、truncatechars  截断

    <p>截断字符:{{ content|truncatechars:20 }}</p>
    <p>截断单词:{{ content|truncatewords:4 }}</p>

        如果content是“I am is haiyan,how are you asd df dfgfdgdg?

        输出结果: 截断字符:I am is haiyan,ho...

        输出结果 :截断单词:I am is haiyan,how ...

    7、safe

    value="<a href="">点击</a>"
    
    {{ value|safe}}
    

    自定义标签和过滤器

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

    2、在app中创建templatetags模块(模块名只能是templatetags)

    3、在templatetags里面创建任意 .py 文件

    如:my_tags.py

    from django import template
    from django.utils.safestring import mark_safe
     
    register = template.Library()   #register的名字是固定的,不可改变
    
    @register.filter   过滤器
    def multi(x,y):
        return x*y
    
    @register.simple_tag  标签
    def multitag(x,y,z):
        return x*y*z
    @register.simple_tag  标签
    def my_input(id,arg):
       result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
       return mark_safe(result)

    #自定义过滤器函数的参数只能两个,可以进行逻辑判断
    #自定义标签无参数限制,不能进行逻辑判断

    4、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py

    {% load my_tags %} 
    

    5、使用

    对于自定义过滤器:
    @register.filter
    def filter_mult(x,y):
        return x+y
    
    {{ 20|filter_mult:3}}   不可以传多个参数,可以用于if 语句中
    
    =============================================
    对于自定义标签:
    @register.simple.tag
    def render_app_name(class):
        return class.name
    
    {% render_app_name  class %}   可以传多个参数,不可以用于if语句中
    
    扩展:
    {% render_app_name  class  as app_name %}  //可以用来循环处理这个返回这
    {% for name in apo_name%}
        pass
    {% endfor %}
    

      

    补充:inclusion_tag的使用

    #!usr/bin/env python
    # -*- coding:utf-8 -*-
    from django.template import Library
    from django.urls import reverse
    from stark.service.v1 import site
    
    register = Library()
    @register.inclusion_tag("stark/form.html")    
    def form(model_form_obj):
        from django.forms import ModelChoiceField
        from django.forms.boundfield import BoundField  # 数据都封装在这个类了
        new_form = []
        for bfield in model_form_obj:
            dic = {"is_popup": False, "item": bfield}  # 每一个bfield就是Form的字段,是一个对象
            if isinstance(bfield.field, ModelChoiceField):
                # print(bfield.field,"popup按钮")
                print(bfield, type(bfield))  # <class 'django.forms.boundfield.BoundField'>
                releated_model_name = bfield.field.queryset.model  # 找到关联的类名
                app_model_name = releated_model_name._meta.app_label, releated_model_name._meta.model_name  # 找到应用名和类名(目的是拼接url)
                base_url = reverse("stark:%s_%s_add" % (app_model_name))
                popup_url = "%s?_popupbackid=%s" % (base_url, bfield.auto_id)  #每一个input框的id
                print(bfield.auto_id,"111111")
                dic["is_popup"] = True
                dic["popup_url"] = popup_url
            new_form.append(dic)
        return {"form":new_form}   #返回的这个form是给了"stark/form.html"它里面的form,然后循环遍历
    

      

     stark/form.html

    使用

    <form method="post" class="form-horizontal" novalidate>
        {% csrf_token %}
        {% for dic in form %}   #使用
            <div class="col-sm-6">
                <div class="form-group">
                    <label for="inputEmail3" class="col-sm-2 control-label">{{ dic.item.label }}</label>
                    <div class="col-sm-10" style="position: relative">
                        {{ dic.item }}
                        {% if dic.is_popup %}
                            <div style="position: absolute;right: -5px;top: 8px;z-index: 9999">
                                <a onclick="popUp('{{ dic.popup_url }}')" class="glyphicon glyphicon-plus"></a>  <!--注意要加引号,不然就会被当成变量了-->
    
                            </div>
                            {#                    判断如果是MOdelChoicesField是Fk#}
                            {#                    判断如果是MOdelChoicesField是Fk#}
                        {% endif %}
                        {{ dic.item.errors.0 }}
                    </div>
                </div>
            </div>
        {% endfor %}
        <div class="col-sm-offset-11 col-sm-1">
            <input type="submit" class="btn btn-primary" value="提交">
        </div>
    </form>
    <script>
        function popupCallback(data) {
            var op = document.createElement("option");
            op.value = data.id;
            op.text = data.text;
            op.setAttribute("selected","selected");
            document.getElementById(data.popupbackid).appendChild(op)
        }
        function popUp(url) {
               var popupPage = window.open(url, url, "status=1, height:500, 600, toolbar=0, resizeable=0");
        }
    
    </script>
    

      

  • 相关阅读:
    unicode编码表
    范仁义js课程---17、赋值运算符
    如何从Apache官网下载windows版apache服务器
    php开发工具zendstudio13破解补丁
    如何彻底删除SVN中的文件和文件夹(附恢复方法)
    proguard.cfg 配置文件
    VMware-workstation-full-12.0.1-3160714
    《吉他自学三月通》学习指导
    [Windows] Adobe Photoshop CC 2015官方原版下载 附破解补丁&破解教程
    【求神——唐伯虎点秋香】
  • 原文地址:https://www.cnblogs.com/yanxiaoge/p/10579713.html
Copyright © 2020-2023  润新知