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>

原文地址:https://www.cnblogs.com/rongzhen/p/10421112.html

时间: 2024-08-28 16:31:52

Django入门--自定义过滤器与标签的相关文章

django自定义过滤器和标签

1.自定义过滤器和标签的流程: 1.在某个app下创建一个名为templatetags(必需,且包名不可变)的包.假设我们在名为app01的app下创建了一个templatetags的包,并在该包下创建了一个名为my_tags的文件 2.settings文件中的INSTALLD_APPS内必须含有该app.接下来,我们需要确认settings文件中的INSTALLED_APPS变量中已经有了app01 INSTALLED_APPS = [ 'django.contrib.admin', 'dja

一、变量.二、过滤器(filter).三、标签(tag).四、条件分支tag.五、迭代器tag.六、自定义过滤器与标签.七、全系统过滤器(了解)

一.变量 ''' 1.视图函数可以通过两种方式将变量传递给模板页面 -- render(request, 'test_page.html', {'变量key1': '变量值1', ..., '变量keyn': '变量值n'}) -- render(request, 'test_page.html', locals()) # locals() 就是将视图函数中的所有变量都传递给模板页面 2.模板页面中对变量的使用 def dtl(request): num = 3.14 ss = '大碗宽面' #

自定义过滤器和标签 &amp; 静态文件相关

自定义过滤器和标签 1.在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. 2.在app中创建templatetags模块(模块名只能是templatetags) 3.创建任意 .py 文件,如:my_tags.py from django import template from django.utils.safestring import mark_safe register = template.Library() #r

django自定义过滤器及标签的布置

1:在app文件下新建templatetags,文件名不可改,django运行时会自动寻址. 2:templatetags下新建py文件. 3:py文件里需要引用申明:from django import template // 引入模板 from django.utils.safestring import mark_safe //此句与mark_safe函数有关,使用不到可略去 register=template.Library() // 注册 4:py文件里定义函数体:def...(x,y

Django之模板层-自定义过滤器以及标签

自定义标签与过滤器 在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. 在app中创建templatetags模块(模块名只能是templatetags) 创建任意 .py 文件,如:my_tags.py from django import template # 该对象名必须是register register = template.Library() #自定义过滤器装饰器 @register.filter def mult

自定义过滤器及标签

代码布局(自定义的代码,放在哪里)1. 某个app特有的 -app 目录下,templatetags 文件夹,包(包含__init__.py文件) -再到 templatetags 文件夹下创建python模块(py文件)2. 定义复用 -创建一个新的app,将他们定义在新的app中,在INSTALL_APPS 注册,然后就可以应用 1.自定义模板过滤器 -模板过滤器是什么 -函数,一般情况下有一个或两个参数 - 第一个参数,是传递进来的模板变量,不一定是字符串 - 第二个参数,普通的参数,也可

Django中自定义过滤器的使用

我在这里做的是: 从数据库查出id递增的一些信息,展示在前台. 编写一个过滤器判断查出数据的id是偶数的返回True 奇数返回False 1 创建项目,创建应用,注册应用,配置settings.py文件,配置urls映射,编写views试图,编写模板templates,编写models模块 切记 注册应用.  很多伙伴找不到自己定义的过滤器,是因为忘记注册应用! 2 创建过滤器的目录: 实际上,在项目目录或者应用目录下创建都是可以的,创建一个名为templatetags的python模块 在我这

自定义过滤器和标签

1.在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. 2.在app中创建templatetags模块(模块名只能是templatetags) 3.创建任意 .py 文件,如:my_tags.py from django import template from django.utils.safestring import mark_safe register = template.Library() #register的名字

django 中自定义过滤器

多参数过滤器 原文地址:https://www.cnblogs.com/liang715200/p/10587819.html