Django(5) - 自定义过滤器及标签

213 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第34天,点击查看活动详情

五,自定义过滤器及标签

满足额外需求

一,自定义过滤器(常用在App下创建)

一,在App下创建
    1.创建templatetags包,注意,这是一个python包
    2.创建customer_filters.py文件
    3.配置:	
        在setting.py下配置,添加App名
            INSTALLED_APPS = [
                'django.contrib.admin',
                'django.contrib.auth',
                'django.contrib.contenttypes',
                'django.contrib.sessions',
                'django.contrib.messages',
                'django.contrib.staticfiles',
                'student'
            ]
二,在根目录下创建
	1.应用场景:当我们想要定义一个或多个App公用的时候
	2.配置:在根目录下创建一个python包,再在setting下添加App名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B9qZsMY9-1592066953340)(assets/1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D8UvD9sS-1592066953346)(assets/2.png)]

三,过滤器导入
	1.在App下的templatetags下的customer_filter里面创建过滤器并注册
    2.在模板里面导入模板标签{% load customer_filters %}
    3.引用:直接使用模板变量,<td>{{ data.sex|to_sex:'en' }}</td>
注意:[to_sex:'en'] 过滤器通过 [:参数]的方式传参,传入的为过滤器的第二个参数
  1. 自定义一个过滤器并注册(通过装饰器或者直接注册)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wQ4v40JO-1592066953353)(assets/3-.png)]

  2. 通过模板标签和模板变量使用过滤器

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1OvFBxfO-1592066953355)(assets/.png)]

二,自定义标签

2.1,简单标签simplet-tag

Django内置的简单标签如:{% url 'app_name:name' data.name %}  data.name是参数

作用:接收多个参数,根据输入的参数和信息进行处理,然后再返回结果

一,创建cumstor_tags.py文件
    1.在templatetags包下面创建cumstor_tags.py文件
    2.直接注册或者通过装饰器注册
  1. 自定义一个简单标签并注册(通过装饰器或者直接注册)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EV2UQH2h-1592066953358)(assets/7.png)]

  1. 直接在模板里面使用模板标签[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MbMgCNND-1592066953360)(assets/8.png)]

  2. 模板标签传参:以format_str为例子(需要通过模板,不美观):

    1. 在视图函数内通过context传送数据format_str到模板里面[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2OulX9yf-1592066953365)(assets/11.png)]

    2. 在模板里面通过模板标签把format_str传入自定义模板标签内处理 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1MCGilFq-1592066953370)(assets/9.png)]

    3. 模板标签处理数据并返回模板[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MSbLWFkP-1592066953373)(assets/10.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L01LVfst-1592066953375)(assets/12.png)]

  3. 引用上下文变量(自定义模板标签直接拿视图函数的context内容,不用通过模板)

    1. 自定义标签设置三步骤,只能能取到视图函数view.py里面的context[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m0ujFXem-1592066953382)(assets/13.png)]
    2. 注意!
      1. 在哪个模板里面使用自定义模板标签,他的context取的就是那个模板的context
      2. 如果一个视图函数返回了很多个context,要会通过模板区分

2.2,包含标签include_tag

作用:通过渲染另一个模板来显示数据

一,创建cumstor_tags.py文件
    1.在templatetags包下面创建cumstor_tags.py文件
    2.直接注册或者通过装饰器注册
  1. 自定义一个包含标签并注册(通过装饰器或者直接注册)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CdKwsA2P-1592066953385)(assets/15.png)]

  2. 创意一个用于配合 包含标签 渲染的模板[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r3Mppyzd-1592066953387)(assets/14.png)]

  3. 在模板中通过模板标签传入数据(这里的值就传入了包含标签的values里)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XRIiS07C-1592066953390)(assets/16.png)]

    渲染成功[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lsnqj9Hn-1592066953393)(assets/17.png)]

  4. 优化(传入多个参数进行判断返回不同的页面)

    {% show aaa.lesson style='link' %}	# 自定义包含标签可以传多个参数,用‘=’传
    
    1. 自定义一个包含标签并注册(通过装饰器或者直接注册)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-omyR9ABf-1592066953395)(assets/19.png)]

    2. 创意一个用于配合 包含标签 渲染的模板[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TANnQUpY-1592066953397)(assets/18.png)]

    3. 在模板中通过模板标签传入数据(这里的值就传入了包含标签的values里)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YrQwYRuq-1592066953399)(assets/20-1557903140494.png)]

      ​ 效果图片:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gHlVw62A-1592066953401)(assets/21.png)]

  5. 引用上下文变量:同上

三,总结

  1. 简单标签:return什么就返回什么

    @register.simple_tag(name='hello', takes_context=True)
    def hello(context):
        return context['hello']
    
  2. 包含标签:先接收数据,通过模板渲染后返回数据

    @register.inclusion_tag('student/show_list.html')
    def show(values, style):
        return {'ls': values, 'style': style}