django入门--自定义过滤器与标签(代码片段)

rongzhen rongzhen     2023-03-09     369

关键词:

为了让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>




















django自定义模板标签和过滤器(代码片段)

Django虽然为我们内置了二十多种标签和六十多种过滤器,但是需求是各种各样的,总有一款你cover不到。Django为我们提供了自定义的机制,可以通过使用Python代码,自定义标签和过滤器来扩展模板引擎,然后使用%load%标签。一、... 查看详情

django(自定义过滤器和自定义标签)(代码片段)

模版是一个用django模版语言标记过的python字符串。模版可以包含模版标签和变量。模版标签是在一个模版里起作用的标记。比如,一个模版标签可以产生控制结构的内容(if或者for),可以获取数据库内容或者访问其它模版标签。... 查看详情

django第五课自定义模板过滤器与标签(代码片段)

...中,在INSTALL_APPS  注册,然后可以应用 自定义模板过滤器模板过滤器是什么?  函数,一个或两个参数    第一个参数是传递进来的模板变量    第二个参数,普通的参数,也可以是默认也可以不要其实就是个... 查看详情

django——模板层:变量过滤器标签自定义标签和过滤器(代码片段)

模板层:变量、过滤器、标签、自定义标签和过滤器将页面的设计和Python的代码分离开会更干净简洁更容易维护。我们可以使用Django的模板系统(TemplateSystem)来实现这种模式#django模板修改的视图函数defcurrent_time(req):fromdjango.template... 查看详情

django中创建自定义标签与过虑器(代码片段)

...签),然后创建python文件common_extrgs.py.common_extrgs.py:fromdjangoimporttemplate#创建template.Library()实例register=template.Library()#使用@register.filter()注册成自定义过滤 查看详情

django自定义过滤器和标签(代码片段)

1、自定义过滤器和标签的流程:1、在某个app下创建一个名为templatetags(必需,且包名不可变)的包。假设我们在名为app01的app下创建了一个templatetags的包,并在该包下创建了一个名为my_tags的文件      2、setting... 查看详情

django自定义模板标签和过滤器(代码片段)

inclusion_tag()在app中新建一个templatetags包(名字固定,不能变,只能是这个),和views.py、models.py等文件处于同一级别目录下。这是一个包!不要忘记创建__init__.py文件以使得该目录可以作为Python的包1.首先,编写Python函数,templatetag... 查看详情

django-dil模板自定义过滤器(代码片段)

自定义过滤器DTL模板语言生来只是为了方便的展示信息,所以与编程语言相比显得有点薄弱,有时候不能满足我们的需求。因此django提供了一个接口,让开发者能自定义标签和过滤器。首先,你需要添加一个templatetags的文件夹,... 查看详情

django--知识补充(代码片段)

自定义标签或过滤器渲染变量的方法(过滤器:修改数据或格式转换)var|addvar|date:"Y-m"var|safe渲染标签的方法%tag_name%%for%……%endfor%%csrf_token%自定义需要在应用目录下创建templatetags的包然后在里面创建Python脚本。自定义过滤器fromd... 查看详情

django基础之视图(views)层模板层(代码片段)

...VCBV最精髓的部分Djangosettings源码分析及实际应用模板传值过滤器(|)标签前端if标签前端for标签前端with标签自定义过滤器、标签自定义的过滤器自定义标签自定义的过滤器和自定义标签模板的继承模板的导入Django请求生命周期Django... 查看详情

django框架基础知识05-自定义模板标签与过滤器

...app目录下创建一个pythonpackage,在其中新建templatetags标签及过滤器的目录目录结构: 注意:templatetags这 查看详情

自定义过滤器和标签(代码片段)

1、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.2、在app中创建templatetags模块(模块名只能是templatetags)3、创建任意.py文件,如:my_tags.pyfromdjangoimporttemplatefromdjango.utils.safestringimportmark_saferegis 查看详情

django——模板层(template)(模板语法自定义模板过滤器及标签模板继承)(代码片段)

前言:当我们想在页面上给客户端返回一个当前时间,一些初学者可能会很自然的想到用占位符,字符串拼接来达到我们想要的效果,但是这样做会有一个问题,HTML被直接硬编码在Python代码之中。1234defcurrent_datetime(request): &nbs... 查看详情

django模板标签(代码片段)

...用Django模板修改页面二、Django模板标签-变量-列表-字典-过滤器1、default2、length3、filesizeformat4、date5、truncatechars6、safe-if/else标签-for标签-ifequal/ifnotequal标签-注释标签-include标签-csrf_token-自定义标签和过滤器-配置静态文件-模板继... 查看详情

django模板标签(代码片段)

...用Django模板修改页面二、Django模板标签-变量-列表-字典-过滤器1、default2、length3、filesizeformat4、date5、truncatechars6、safe-if/else标签-for标签-ifequal/ifnotequal标签-注释标签-include标签-csrf_token-自定义标签和过滤器-配置静态文件-模板继... 查看详情

django入门系列之(模板层)(代码片段)

本文目录一模版简介二模版语法之变量三模版之过滤器四模版之标签五自定义标签和过滤器六模版导入入和继承七静态文件相关回到目录一模版简介 你可能已经注意到我们在例子视图中返回文本的方式有点特别。也就是说,... 查看详情

django模板层(变量分配过滤器标签继承和导入自定义过滤器标签及inclusion_tag(了解))(代码片段)

目录一、模板变量分配定义 在后端变量的值通过模板语法传到前端符号:主要与数据值相关%%:主要与逻辑相关模板语法注意点:1.针对需要加括号调用的名字django模板语法会自动加括号调用你只需要写名字就行2.模板语法的注释##... 查看详情

django---进阶4(代码片段)

目录CBV源码剖析模版语法传值过滤器(过滤器只能最多有两个参数)标签自定义过滤器、标签、inclusion_tag模版的继承模版的导入作业CBV源码剖析#你自己不要修改源码除了bug很难找#突破口在urls.pyurl(r‘^login/‘,views.MyLogin.as_view())#url(... 查看详情