zoukankan      html  css  js  c++  java
  • Django入门--自定义过滤器与标签

    ---恢复内容开始---

    为了让Django找到自定义的模板过滤器和模板标签,需要进行文件路径配置,配置方式分为APP目录下配置和项目路径下配置两种方式:

    1.在APP目录下配置:针对某个应用特定的自定义
    第一步:在APP目录下创建"templatetags"文件夹;
    第二步:在"templatetags"文件夹下创建python模块(py文件)
    2.在项目目录下配置:针对所有应用的自定义
    第一步:在项目目录下创建一个新的app,例如"common"文件夹
    第二步:在项目目录settings.py文件下的INSTALL_APPS对新app进行注册
    第三步:在"common"文件夹下创建"templatetags"文件夹,在文件夹里创建自定义过滤器及标签
    下面以第二种方式进行配置

    一、自定义过滤器

    模板过滤器本质上是函数,有一个或两个参数,返回字符串
        第一个参数是传递进来的模板变量(不一定是字符串)
        第二个参数是普通参数,可以是默认参数,也可以不要
    在新建的templatetags文件夹下创建"common_filter.py"文件
    要求,数据库中通过0、1记录性别,0表示女生,1表示男生,在common_filter.py文件自定义langunge功能,选择语言输出性别,其步骤如下:

    1).template/student/views.py文件
    def index(request):
        students = [
            {"id":10117,"name":'Willy', "age":21, "sex":1},
            {"id":10121,"name":'Kitty', "age":20, "sex":0},
            {"id":10128,"name":'Kate', "age":19, "sex":0},
            {"id":10133,"name":'Tom', "age":22, "sex":1},
            {"id":10135,"name":'Rose', "age":20, "sex":0}
        ]
        return render(request, 'student/index.html', context={
            'students':students,
        })
    
    2).编辑common_filter.py文件,定义过滤器language函数,并通过django.template.Library的实例的filter方法进行注册

    templeatetags/common_filter.py设置

    from django import template
    
    register = template.Library()
    
    # 普通注册
    def language(value, arg="zh"):
        dt = {
            "zh":['女', '男'],
            "en":['female', 'male']
        }
        return dt[arg][value]                #value为输入的值,分别为0、 1
    
    register.filter(name="la", language)
    
    

    或者

    from django import template
    
    register = template.Library()
    
    # 装饰器注册
    @register.filter
    def language(value, arg="zh"):
        dt={
            "zh":['女','男'],
            "en":['female', 'male']
        }
        return dt[arg][value]               
    
    
    3).在模板中使用,需要先通过python模块名进行load加载,然后在需要使用过滤器的地方添加自定义过滤器

    在模板文件templates/student/index.html中调用需要先load下

    # load调用自定义过滤器
    {% load common_filter %}
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    

    然后通过参数调用,通过修改anguage参数可以改变性别语言输出,其中"zh"为默认参数

            <table class="table">
                <thead>
                    <tr>
                        <th>序号</th>
                        <th>姓名</th>
                        <th>年龄</th>
                        <th>性别</th>
                    </tr>
                </thead>
                <tbody>
                    {% for stu in students %}
                        <tr {% if stu.sex == 'Male' %}
                                style="color:red"
                            {% endif %}>
                            <td><a href="{% url "student:detail"  stu.id%}">
                                {{ forloop.counter }}
                                </a>
                            </td>
                            <td>{{ stu.name }}</td>
                            <td>{{ stu.age }}</td>
                            # 调用自定义过滤器
                            <td>{{ stu.sex|language:"en" }}</td>
                        </tr>
                    {% endfor %}
                </tbody>
            </table>
    

    二、自定义标签

    模板标签用于实现各种逻辑,如for、if等,但有些逻辑无法用模块标签实现。Django提供了很多快捷方式编写大多数的类型的标签,常用的有简单标签以及自定义标签
    更多自定义的标签类型请参照Django自定义标签
    许多模板标签接受字符串、模板变量等作为参数,并根据输入的参数与外部信息进行处理,返回结果,例如url模板标签接受一个字符串以及模板变量,输出想要的结果。

    1.简单标签(Sample)

    Django通过django.template.Library.simple_tag()来编辑简单标签
    创建一个输出当前时间的自定义标签

    (1).方式一:一般使用

    在新建的templatetags文件夹下创建"common_tag.py"文件,并通过django.template.Library的实例的simple_tag方法进行注册

    1).common_tags.py文件:定义标签并注册
    rom django import template
    from datetime import datetime
    
    register = template.Library()
    
    @register.simple_tag(name="current")
    
    def current_time(format_str):
        return datetime.now().strftime(format_str)
    
    2).templates/student/html文件:使用自定义标签
    # load调用自定义过滤器
    {% load common_tags %}
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    
        title>学生信息网页</title>
        <link href="{% static 'student/css/mystyle.css' %}" rel="stylesheet">
    </head>
    <body>
        # 调用自定义标签
        <h1>当前时间为:{% current '%Y-%m-%d %H:%M:%S' %}</h1>
    </body>
    </html>
    
    (2).方式二:上下文传参

    在views.py中先设置format_str,然后通过context进行传递

    1).student/views.py:定义模板变量
    def index(request):
    students = [
    {"id":10117,"name":'Willy', "age":21, "sex":1},
    {"id":10121,"name":'Kitty', "age":20, "sex":0},
    {"id":10128,"name":'Kate', "age":19, "sex":0},
    {"id":10133,"name":'Tom', "age":22, "sex":1},
    {"id":10135,"name":'Rose', "age":20, "sex":0}
    ]
    format_str = "%Y-%m-%d %H:%M:%S"
    return render(request, 'student/index.html', context={
        'students':students,
        'format_str':format_str
    })
    
    2).templatetags/common_tags.py文件:定义标签并注册,在simple_tag中设置take_context=True
    from django import template
    from datetime import datetime
    
    register = template.Library()
    
    @register.simple_tag(name="current", takes_context=True)
    def current_time(context):
        return datetime.now().strftime(context['format_str'])
    
    3).templates/student/html文件:使用标签
    # load调用自定义过滤器
    {% load common_tags %}
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    
        <title>学生信息网页</title>
        <link href="{% static 'student/css/mystyle.css' %}" rel="stylesheet">
    </head>
    <body>
        # 调用自定义标签,不需要添加参数
        <h1>当前时间为:{% current %}</h1>
    </body>
    </html>
    

    2.包含标签(Inclusion)

    另一种常见的标签类型,通过渲染另一个模板来展示数据。有时候需要把某些数据渲染成一个固定样式是需要用到包含标签

    Django通过django.template.Library.inclue_tag()来编辑简单标签
    创建一个输出当前时间的自定义标签
    在新建的templatetags文件夹下创建"common_tag.py"文件,并通过django.template.Library的实例的simple_tag方法进行注册,其步骤为:
        a).定义views.py,为students添加课程信息:student/views.py
        b).定义一个函数,接受调用时传递的模板变量:student/templatetags/comon_tags.py
        c).在定义一个html模板:templates/student/show_list_as_ul.html
        d).编辑index.html:templates/student/index.html

    (1) 只有一个参数
    1).student/views.py
    def index(request):
        students = [
            {"id":10117,"name":'Willy', "age":21, "sex":1, "course":['python', 'java', 'C', 'C++']},
            {"id":10121,"name":'Kitty', "age":20, "sex":0, "course":['python', 'java', 'C', 'C++']},
            {"id":10128,"name":'Kate', "age":19, "sex":0, "course":['python', 'java', 'C', 'C++']},
            {"id":10133,"name":'Tom', "age":22, "sex":1, "course":['python', 'java', 'C', 'C++']},
            {"id":10135,"name":'Rose', "age":20, "sex":0, "course":['python', 'java', 'C', 'C++']}
        ]
        return render(request, 'student/index.html', context={
            'students':students,
        })
    
    2).student/templatetags/comon_tags.py
    from django import template
    from datetime import datetime
    
    register = template.Library()
    
    @register.inclusion_tag("student/show_list_as_ul.html")
    def show_list_as_ul(value):
        return {'ls': value}
    
    3).templates/student/show_list_as_ul.html

    其中ls为2)中定义的ls

    <ul>
        {% for l in ls %}
            <li>{{ l }}</li>
        {% endfor %}
    
    </ul>
    
    4).templates/student/index.html
    {% load common_tags %}
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    
    <div class="container">
        <table class="table">
            <thead>
                <tr>
                    <th>序号</th>
                    <th>姓名</th>
                    <th>年龄</th>
                    <th>性别</th>
                    <th>课程</th>
                </tr>
            </thead>
            <tbody>
                {% for stu in students %}
                <tr {% if stu.sex == 'Male' %}
                    style="color:red"
                {% endif %}>
                    <td><a href="{% url "student:detail" stu.id%}">
                            {{ forloop.counter }}
                        </a>
                    </td>
                    <td>{{ stu.name }}</td>
                    <td>{{ stu.age }}</td>
                    <td>{{ stu.sex}</td>
                    # 调用自定义标签
                    <td>{% show_list_as_ul stu.course %}</td>
                </tr>
                {% endfor %}
            </tbody>
    </table>
    </div>
    
    (2) 有两个参数
    1).student/views.py
    def index(request):
        students = [
            {"id":10117,"name":'Willy', "age":21, "sex":1, "course":['python', 'java', 'C', 'C++']},
            {"id":10121,"name":'Kitty', "age":20, "sex":0, "course":['python', 'java', 'C', 'C++']},
            {"id":10128,"name":'Kate', "age":19, "sex":0, "course":['python', 'java', 'C', 'C++']},
            {"id":10133,"name":'Tom', "age":22, "sex":1, "course":['python', 'java', 'C', 'C++']},
            {"id":10135,"name":'Rose', "age":20, "sex":0, "course":['python', 'java', 'C', 'C++']}
        ]
        return render(request, 'student/index.html', context={
            'students':students,
        })
    
    2).student/templatetags/comon_tags.py
    from django import template
    from datetime import datetime
    
    register = template.Library()
    
    @register.inclusion_tag("student/show_list_as_ul.html")
    def show_list_as_ul(value, style):
        return {'ls': value, 'style', style}
    
    3).templates/student/show_list_as_ul.html

    其中style、ls为2)中定义的style和ls

    {% if style == 'button' %}
        <div class="list-group">
            {% for l in ls %}
                <button type="button" class="list-group-item">{{ l }}</button>
            {% endfor %}
        </div>
    {% elif style == 'link' %}
        <div class="list-group">
            {% for l in ls %}
                <a href="#" class="list-group-item active">{{ l }}</a>
            {% endfor %}
        </div>>
    {% else %}
        <ul class="list-group">
            {% for l in ls %}
                <li class="list-group-item">{{ l }}</li>
            {% endfor %}
        </ul>
    {% endif %}
    
    
    4).templates/student/index.html
    {% load common_tags %}
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    
    <div class="container">
        <table class="table">
            <thead>
                <tr>
                    <th>序号</th>
                    <th>姓名</th>
                    <th>年龄</th>
                    <th>性别</th>
                    <th>课程</th>
                </tr>
            </thead>
            <tbody>
                {% for stu in students %}
                <tr {% if stu.sex == 'Male' %}
                    style="color:red"
                {% endif %}>
                    <td><a href="{% url "student:detail" stu.id%}">
                            {{ forloop.counter }}
                        </a>
                    </td>
                    <td>{{ stu.name }}</td>
                    <td>{{ stu.age }}</td>
                    <td>{{ stu.sex }}</td>
                    # 调用自定义标签,改变参数"link"、"button"等输出不同样式
                    <td>{% show_list_as_ul stu.course  'link'%}</td>
                </tr>
                {% endfor %}
            </tbody>
    </table>
    </div>
    ```<p>---恢复内容结束---</p>为了让Django找到自定义的模板过滤器和模板标签,需要进行文件路径配置,配置方式分为APP目录下配置和项目路径下配置两种方式:
    
    **1.在APP目录下配置:针对某个应用特定的自定义**
    第一步:在APP目录下创建"templatetags"文件夹;
    第二步:在"templatetags"文件夹下创建python模块(py文件)
    **2.在项目目录下配置:针对所有应用的自定义**
    第一步:在项目目录下创建一个新的app,例如"common"文件夹
    第二步:在项目目录settings.py文件下的INSTALL_APPS对新app进行注册
    第三步:在"common"文件夹下创建"templatetags"文件夹,在文件夹里创建自定义过滤器及标签
    下面以第二种方式进行配置
    
    ### 一、自定义过滤器
    模板过滤器本质上是函数,有一个或两个参数,返回字符串
    &emsp; &emsp;  第一个参数是传递进来的模板变量(不一定是字符串)
    &emsp; &emsp;  第二个参数是普通参数,可以是默认参数,也可以不要
    在新建的templatetags文件夹下创建"common_filter.py"文件
    要求,数据库中通过0、1记录性别,0表示女生,1表示男生,在common_filter.py文件自定义langunge功能,选择语言输出性别,其步骤如下:
    ###### 1).template/student/views.py文件
    ```python
    def index(request):
        students = [
            {"id":10117,"name":'Willy', "age":21, "sex":1},
            {"id":10121,"name":'Kitty', "age":20, "sex":0},
            {"id":10128,"name":'Kate', "age":19, "sex":0},
            {"id":10133,"name":'Tom', "age":22, "sex":1},
            {"id":10135,"name":'Rose', "age":20, "sex":0}
        ]
        return render(request, 'student/index.html', context={
            'students':students,
        })
    
    2).编辑common_filter.py文件,定义过滤器language函数,并通过django.template.Library的实例的filter方法进行注册

    templeatetags/common_filter.py设置

    from django import template
    
    register = template.Library()
    
    # 普通注册
    def language(value, arg="zh"):
        dt = {
            "zh":['女', '男'],
            "en":['female', 'male']
        }
        return dt[arg][value]                #value为输入的值,分别为0、 1
    
    register.filter(name="la", language)
    
    

    或者

    from django import template
    
    register = template.Library()
    
    # 装饰器注册
    @register.filter
    def language(value, arg="zh"):
        dt={
            "zh":['女','男'],
            "en":['female', 'male']
        }
        return dt[arg][value]               
    
    
    3).在模板中使用,需要先通过python模块名进行load加载,然后在需要使用过滤器的地方添加自定义过滤器

    在模板文件templates/student/index.html中调用需要先load下

    # load调用自定义过滤器
    {% load common_filter %}
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    

    然后通过参数调用,通过修改anguage参数可以改变性别语言输出,其中"zh"为默认参数

            <table class="table">
                <thead>
                    <tr>
                        <th>序号</th>
                        <th>姓名</th>
                        <th>年龄</th>
                        <th>性别</th>
                    </tr>
                </thead>
                <tbody>
                    {% for stu in students %}
                        <tr {% if stu.sex == 'Male' %}
                                style="color:red"
                            {% endif %}>
                            <td><a href="{% url "student:detail"  stu.id%}">
                                {{ forloop.counter }}
                                </a>
                            </td>
                            <td>{{ stu.name }}</td>
                            <td>{{ stu.age }}</td>
                            # 调用自定义过滤器
                            <td>{{ stu.sex|language:"en" }}</td>
                        </tr>
                    {% endfor %}
                </tbody>
            </table>
    

    二、自定义标签

    模板标签用于实现各种逻辑,如for、if等,但有些逻辑无法用模块标签实现。Django提供了很多快捷方式编写大多数的类型的标签,常用的有简单标签以及自定义标签
    更多自定义的标签类型请参照Django自定义标签
    许多模板标签接受字符串、模板变量等作为参数,并根据输入的参数与外部信息进行处理,返回结果,例如url模板标签接受一个字符串以及模板变量,输出想要的结果。

    1.简单标签(Sample)

    Django通过django.template.Library.simple_tag()来编辑简单标签
    创建一个输出当前时间的自定义标签

    (1).方式一:一般使用

    在新建的templatetags文件夹下创建"common_tag.py"文件,并通过django.template.Library的实例的simple_tag方法进行注册

    1).common_tags.py文件:定义标签并注册
    rom django import template
    from datetime import datetime
    
    register = template.Library()
    
    @register.simple_tag(name="current")
    
    def current_time(format_str):
        return datetime.now().strftime(format_str)
    
    2).templates/student/html文件:使用自定义标签
    # load调用自定义过滤器
    {% load common_tags %}
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    
        title>学生信息网页</title>
        <link href="{% static 'student/css/mystyle.css' %}" rel="stylesheet">
    </head>
    <body>
        # 调用自定义标签
        <h1>当前时间为:{% current '%Y-%m-%d %H:%M:%S' %}</h1>
    </body>
    </html>
    
    (2).方式二:上下文传参

    在views.py中先设置format_str,然后通过context进行传递

    1).student/views.py:定义模板变量
    def index(request):
    students = [
    {"id":10117,"name":'Willy', "age":21, "sex":1},
    {"id":10121,"name":'Kitty', "age":20, "sex":0},
    {"id":10128,"name":'Kate', "age":19, "sex":0},
    {"id":10133,"name":'Tom', "age":22, "sex":1},
    {"id":10135,"name":'Rose', "age":20, "sex":0}
    ]
    format_str = "%Y-%m-%d %H:%M:%S"
    return render(request, 'student/index.html', context={
        'students':students,
        'format_str':format_str
    })
    
    2).templatetags/common_tags.py文件:定义标签并注册,在simple_tag中设置take_context=True
    from django import template
    from datetime import datetime
    
    register = template.Library()
    
    @register.simple_tag(name="current", takes_context=True)
    def current_time(context):
        return datetime.now().strftime(context['format_str'])
    
    3).templates/student/html文件:使用标签
    # load调用自定义过滤器
    {% load common_tags %}
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    
        title>学生信息网页</title>
        <link href="{% static 'student/css/mystyle.css' %}" rel="stylesheet">
    </head>
    <body>
        # 调用自定义标签
        <h1>当前时间为:{% current %}</h1>
    </body>
    </html>
    

    2.包含标签(Inclusion)

    另一种常见的标签类型,通过渲染另一个模板来展示数据。有时候需要把某些数据渲染成一个固定样式是需要用到包含标签

    Django通过django.template.Library.inclue_tag()来编辑简单标签
    创建一个输出当前时间的自定义标签
    在新建的templatetags文件夹下创建"common_tag.py"文件,并通过django.template.Library的实例的simple_tag方法进行注册,其步骤为:
        a).定义views.py,为students添加课程信息:student/views.py
        b).定义一个函数,接受调用时传递的模板变量:student/templatetags/comon_tags.py
        c).在定义一个html模板:templates/student/show_list_as_ul.html
        d).编辑index.html:templates/student/index.html

    (1) 只有一个参数
    1).student/views.py
    def index(request):
        students = [
            {"id":10117,"name":'Willy', "age":21, "sex":1, "course":['python', 'java', 'C', 'C++']},
            {"id":10121,"name":'Kitty', "age":20, "sex":0, "course":['python', 'java', 'C', 'C++']},
            {"id":10128,"name":'Kate', "age":19, "sex":0, "course":['python', 'java', 'C', 'C++']},
            {"id":10133,"name":'Tom', "age":22, "sex":1, "course":['python', 'java', 'C', 'C++']},
            {"id":10135,"name":'Rose', "age":20, "sex":0, "course":['python', 'java', 'C', 'C++']}
        ]
        return render(request, 'student/index.html', context={
            'students':students,
        })
    
    2).student/templatetags/comon_tags.py
    from django import template
    from datetime import datetime
    
    register = template.Library()
    
    @register.inclusion_tag("student/show_list_as_ul.html")
    def show_list_as_ul(value):
        return {'ls': value}
    
    3).templates/student/show_list_as_ul.html

    其中ls为2)中定义的ls

    <ul>
        {% for l in ls %}
            <li>{{ l }}</li>
        {% endfor %}
    
    </ul>
    
    4).templates/student/index.html
    {% load common_tags %}
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    
    <div class="container">
        <table class="table">
            <thead>
                <tr>
                    <th>序号</th>
                    <th>姓名</th>
                    <th>年龄</th>
                    <th>性别</th>
                    <th>课程</th>
                </tr>
            </thead>
            <tbody>
                {% for stu in students %}
                <tr {% if stu.sex == 'Male' %}
                    style="color:red"
                {% endif %}>
                    <td><a href="{% url "student:detail" stu.id%}">
                            {{ forloop.counter }}
                        </a>
                    </td>
                    <td>{{ stu.name }}</td>
                    <td>{{ stu.age }}</td>
                    <td>{{ stu.sex}</td>
                    # 调用自定义标签
                    <td>{% show_list_as_ul stu.course %}</td>
                </tr>
                {% endfor %}
            </tbody>
    </table>
    </div>
    
    (2) 有两个参数
    1).student/views.py
    def index(request):
        students = [
            {"id":10117,"name":'Willy', "age":21, "sex":1, "course":['python', 'java', 'C', 'C++']},
            {"id":10121,"name":'Kitty', "age":20, "sex":0, "course":['python', 'java', 'C', 'C++']},
            {"id":10128,"name":'Kate', "age":19, "sex":0, "course":['python', 'java', 'C', 'C++']},
            {"id":10133,"name":'Tom', "age":22, "sex":1, "course":['python', 'java', 'C', 'C++']},
            {"id":10135,"name":'Rose', "age":20, "sex":0, "course":['python', 'java', 'C', 'C++']}
        ]
        return render(request, 'student/index.html', context={
            'students':students,
        })
    
    2).student/templatetags/comon_tags.py
    from django import template
    from datetime import datetime
    
    register = template.Library()
    
    @register.inclusion_tag("student/show_list_as_ul.html")
    def show_list_as_ul(value, style):
        return {'ls': value, 'style', style}
    
    3).templates/student/show_list_as_ul.html

    其中style、ls为2)中定义的style和ls

    {% if style == 'button' %}
        <div class="list-group">
            {% for l in ls %}
                <button type="button" class="list-group-item">{{ l }}</button>
            {% endfor %}
        </div>
    {% elif style == 'link' %}
        <div class="list-group">
            {% for l in ls %}
                <a href="#" class="list-group-item active">{{ l }}</a>
            {% endfor %}
        </div>>
    {% else %}
        <ul class="list-group">
            {% for l in ls %}
                <li class="list-group-item">{{ l }}</li>
            {% endfor %}
        </ul>
    {% endif %}
    
    
    4).templates/student/index.html
    {% load common_tags %}
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    
    <div class="container">
        <table class="table">
            <thead>
                <tr>
                    <th>序号</th>
                    <th>姓名</th>
                    <th>年龄</th>
                    <th>性别</th>
                    <th>课程</th>
                </tr>
            </thead>
            <tbody>
                {% for stu in students %}
                <tr {% if stu.sex == 'Male' %}
                    style="color:red"
                {% endif %}>
                    <td><a href="{% url "student:detail" stu.id%}">
                            {{ forloop.counter }}
                        </a>
                    </td>
                    <td>{{ stu.name }}</td>
                    <td>{{ stu.age }}</td>
                    <td>{{ stu.sex }}</td>
                    # 调用自定义标签,改变参数"link"、"button"等输出不同样式
                    <td>{% show_list_as_ul stu.course  'link'%}</td>
                </tr>
                {% endfor %}
            </tbody>
    </table>
    </div>
    
  • 相关阅读:
    【原】Storm序列化
    【原】Storm学习资料推荐
    【原】Storm实战
    【原】Storm环境搭建
    Autofac基本使用(转载)
    Autofac学习之三种生命周期:InstancePerLifetimeScope、SingleInstance、InstancePerDependency
    RabbitMQ 默认端口号
    RabbitMQ-客户端
    百度地图-生成器
    uploadify 配置后,页面显示无效果
  • 原文地址:https://www.cnblogs.com/rongzhen/p/10421112.html
Copyright © 2011-2022 走看看