templates 模板层
DTL:django模板语言
核心:
变量{{}}
标签{% %}
render 渲染页面,可以通过locals()将函数的私有属性
views文件下内容
def index(request): age = 18 name = "lqz" dic = {'name':'msj',"age":25,'hobbies':['paly','game']} li1 = [18,'lqz','ppp',123] class Person: def __init__(self,name): self.name = name def test(self): print('test') return 'test' @classmethod def test_classmethod(cls): print('类方法') return '类方法' @staticmethod def staticmethod_test(): print("静态方法") return '静态方法' def __str__(self): return 'Person' lqz= Person('lqz') egon = Person('egon') person_list = [lqz,egon] def aaa(): return 'aaaaaaa' bol1 = False bol2 = [] bol3 = [1,] file_size = 10240 ctime = datetime.datetime.now() new_name= 'abcdefghijk' new_words = "you will have a good day" a = '<a href="http://www.baidu..com">点击连接</a>' return render(request,'index.html',locals()) #locals(),将所有的index属性的作为参数传给模板变量
变量渲染:{{}}
变量深度查询:{{变量。索引/key/方法}}
<h2>基本的变量解析使用的两个{}的用法+变量名</h2> <p>{{ age }}</p> <p>{{ name }}</p> <p>{{ dic }}</p> <p>{{ li1 }}</p>
<h2>变量深度查询:变量.索引/key值/方法</h2> <p>{{ dic.name }}</p> <p>{{ dic.hobbies }}</p> <p>{{ li1.0 }}</p> <p>{{ li1.1 }}</p> <p>{{ dic.hobbies.1 }}</p>
<h3>方法的调用,对象方法</h3> <p>{{ person_list.1.test }}</p> <h3>在views,使用直接向变量使用就可调用</h3> <p>{{ aaa }}</p>
变量之过滤器(是个函数)
{{age| add:参数}}
add
<p>age| add:2 {{ age| add:2 }}</p>
length
<p>name|length {{ name|length }}</p>
default
<h3>default 简单的判断,当前一个变量为空或False的时候,那么返回default 后面的内容,否则返回原来的内容</h3> <p>{{ bol1|default:'假的' }}</p> <p>{{ bol2|default:'空的' }}</p> <p>{{ bol3|default:'存在' }}</p>
filesizeformat
<h3>filesizeformat 将数字装换数据大小</h3> <p>file_size|filesizeformat {{ file_size|filesizeformat }}</p>
date
<h3>date:"加上格式"来创建内容</h3> <p>{{ ctime }}</p> <p>{{ ctime|date:'Y-m-d' }}</p>
slice
<h3>slice:"开始索引,结束索引" 切片</h3> <p>new_name|slice:'2:-1' {{ new_name|slice:'2:-1' }}</p>
truncatechars
truncatewords
<h3>truncatechars 省略字符 ...也算做字符长度</h3> <p>new_name|truncatechars:6{{ new_name|truncatechars:6 }}</p> <h3>truncatewords 省略单词 ...不算做单词长度</h3> <p>new_words|truncatewords:3{{ new_words|truncatewords:3 }}</p>
safe
<h3>有后台的连接的字符串的能够</h3> <a href="http://www.baidu..com">点击连接</a> <p>正常,不用safe {{ a }}</p> <p>a|safe {{ a|safe }}</p>
4.模板之标签
-语法:{% %}
for标签循环
<h2>模板标签主要作用:流程控制或一定程度的处理,可以接受多个参数</h2> <h3>for模板标签的基本使用 for li in li1</h3> {% for li in li1 %} <p>{{ li}}</p> {% endfor %} <h3>反向循环 for li in li1 reversed </h3> {% for li in li1 reversed %} <p>{{ li}}</p> {% endfor %}
forloop用查看循环内容的信息
<h3>forloop只能在for循环中使用,可以获得一系列的数据,包括上级循环的信息,本次循环的位置,是否是开头,是否是结尾等</h3> {% for li in li1 %} {{ forloop }} <p>{{ li}}</p> {% endfor %} <h3>结果如下:{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}</h3> <p>parentloop:父级信息</p> <p>counter0:从0计数索引</p> <p>counter:从1计数索引</p> <p>revcounter:反向从1计数索引</p> <p>revcounter0:反向从0计数索引</p> <p>first:是第一位?</p> <p>last:是最后一位吗?</p>
empty标签在空循环的情况下执行
<h3>empty标签:空循环则执行下面的内容,也必须在for循环总才可生效</h3> {% for foo in bol2 %} {{ foo }} {% empty %} <p>你的循环为空循环</p> {% endfor %}
if elif else分支结构
<h3>if else elif 标签的使用</h3> {% if age < 10 %} <p>年龄小于10岁</p> {% elif age < 20 %} <p>年龄在10-20</p> {% else %} <p>年龄>20</p> {% endif %}
对于较长的变量可以使用with标签
<h3>with标签 起别名</h3> {% with person_list.1 as a %} {{ a }} {% endwith %}
5.自定义过滤器和自定义标签
1、确认在settings文件的设置,
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', ]
2、在app01文件夹下创建python directory 包(固定名称 templatetags)
3.在包下创建py文件,用于自定义过滤器和标签
4.导入
from django.template import Library register = Library()#固定格式
过滤器
@register.filter(name ="myadd") def my_add(a,b): return a+b
标签
@register.simple_tag(name='addd') def tag_add(a,b,c): return a+b+c
5.模板中使用
{% load my_tags %} <!--导入过滤器和标签--> {{ age|myadd:5 }} <!--正常过滤器的使用--> <p>{% addd 1 2 3 %}</p> <!--正常标签的使用-->