23 模板层之自定义过滤器、标签、inclusion_tag+模板的继承,导入
一、自定义过滤器、标签、inclusion_tag
做一个大致了解即可(使用频率不高)
过滤器相当于python中的内置函数 自定义过滤器相当于python中自定义函数
自定义标签也是
自定义过滤器 标签 inclusion_tag都需要三步走战略
1.在应用文件夹下创建一个名字必须叫templatetags文件夹
2.在创建的文件夹下创建一个任意名称的py文件,如:my_tags.py
3.在该py文件内先固定写两句话
from django import template
register = template.Library()
my_tags.py
1. 自定义过滤器(无论是内置的还是自定义都只能最多两个参数) @register.filter(name='haha') def aaa(a, b): return a + b 2. 自定义标签(自定义的标签可以定义多个参数) @register.simple_tag(name='heihei') def bbb(a, b, c, d): return '%s|%s|%s|%s' % (a, b, c, d) 3. 自定义inclusion_tag
内部原理
先定义一个方法
在页面上调用该方法 并且可以传值
该方法会生成一些数据然后传递给一个html页面
之后将渲染好的结果放到调用的位置
@register.inclusion_tag('myul.html',name='my_ul') def my_ul(n): new_list = [] for i in range(1,n): new_list.append('第%s次'%i) return locals()
总结:inclusion_tag
4.自定义过滤器或标签必须重新启动django方可生效
views.py
from django.shortcuts import render,HttpResponse,redirect
def index(request): s=111 return render(request,"index.html",locals())
5.自定义过滤器或标签或inclusion_tag的使用
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--必须先加载存有自定义过滤器和标签的文件--> {% load my_tags %} <!--结果为222--> {{ s|haha:111 }} <!--结果为1|2|3|4--> {% heihei 1 2 3 4 %} <!--结果为 第1次 第2次 第3次 第4次 --> {% my_ul 10 %} """ </body> </html>
6.my_url.html
<ul> {% for foo in new_list %} <li>{{ foo }}</li> {% endfor %} </ul>
对比自定义标签与自定义过滤器
#1、自定义过滤器只能传两个参数,而自定义标签却可以传多个参数 #2、过滤器可以用于if判断,而标签不能 {% if salary|my_multi_filter:12 > 200 %} <p>优秀</p> {% else %} <p>垃圾</p> {% endif %}
二、模板的导入和继承
在实际开发中,模板文件彼此之间可能会有大量冗余代码,为此django提供了专门的语法来解决这个问题,主要围绕三种标签的使用:include标签、extends标签、block标签,详解如下
1.模板的导入之include标签
""" 将页面的某一个局部当成模块的形式(该模板不应该是一个完整的页面 而是一个局部页面) 哪个地方需要就可以直接导入使用即可 """ {% include '模版名称' %}
2.模版的继承
""" 你们有没有见过一些网站 这些网站页面整体都大差不差 只是某一些局部在做变化 """
母版:
# 继承了之后子页面跟模版页面长的是一模一样的 你需要在模版页面上提前划定可以被修改的区域 {% block 自定义名称 %} #自定义名称可以是content\title\cs\js等 母版内容 {% endblock %}
子版
# 模版的继承 你自己先选好一个你要想继承的模版页面
{% extends 'home.html' %}
# 子页面就可以声明想要修改哪块划定了的区域
{% block 自定义名称 %}
自定义其他内容
{{ block.super }} # 也可以引用母版的内容 {% endblock %} # 一般情况下母版页面上应该至少有三块可以被修改的区域 1.css区域 2.html区域 3.js区域 {% block css %} {% endblock %} {% block content %} 可以根据页面内容的布局写多个 {% endblock %} {% block js %} {% endblock %} # 每一个子页面就都可以有自己独有的css代码 html代码 js代码 """ 一般情况下 模版的页面上划定的区域越多 那么该模版的扩展性就越高 但是如果太多 那还不如自己直接写 """