首页 > 其他分享 >django模板层

django模板层

时间:2022-12-14 15:58:29浏览次数:46  
标签:list django 语法 索引 html foo 模板

内容概要

  • 模板层传值语法
  • 模板层语法-过滤器
  • 模板层标签语法
  • 模型层自定义标签、过滤器与inclusion_tag
  • 模型层模板继承与导入

模板层传值语法

"""
django提供的模板语法只有两个符号
	{{}}:主要用于变量相关操作(引用)
	{%%}:主要用于逻辑相关操作(循环、判断)
"""

1.传值的两种方式
	# 传值方式1:指名道姓的传,适用于数据量较少的情况,节省资源
    return render(request, 'ab.html', {'name':name})
	# 传值方式2:打包传值,适用于数据量较多的情况(偷懒),浪费资源
      '''locals() 将当前名称空间中所有的名字全部传递给html页面'''
    return render(request, 'ab_temp.html', locals())

2.传值的范围
	基本数据类型都可以;
    函数名:
        模板语法会自动加括号执行并将函数的返回值展示到页面上;
        不支持传参(模板语法会自动忽略有参函数);
    文件名:
  		直接显示文件IO对象;
    类名:
  		自动加括号实例化成对象;
    对象名:
  		直接显示对象的地址,并且具备调用属性和方法的能力;

# django模板语法针对容器类型的取值 只有一种方式>>>:句点符
	data1 = {'info':{'pro':[11, 22, 33, {'name':'jason','msg':'努力就有收获'}]}};
	既可以点key值也可以点索引,django内部会自动识别;
  	{{ data1.info.pro.3.msg }}

模板层语法-过滤器

{{ 数据对象|过滤器名称:参数 }}  过滤器最多只能额外传输一个参数

eg: <p>统计数据的长度:{{ s1|length }}</p>
过滤器 用法 代码
last 获取列表/元组的最后一个成员 {{liast | last}}
first 获取列表/元组的第一个成员 {{list|first}}
length 获取数据的长度 {{list | length}}
defualt 当变量没有值的情况下, 系统输出默认值, {{str|default="默认值"}}
safe 让系统不要对内容中的html代码进行实体转义 {{htmlcontent| safe}}
upper 字母转换成大写 {{str | upper}}
lower 字母转换成小写 {{str | lower}}
title 每个单词首字母转换成大写 {{str | title}}
date 日期时间格式转换 `{{ value
cut 从内容中截取掉同样字符的内容 {{content | cut:"hello"}}
list 把内容转换成列表格式 {{content | list}}
add 加法 {{num| add}}
filesizeformat 把文件大小的数值转换成单位表示 {{filesize | filesizeformat}}
join 按指定字符拼接内容 {{list| join("-")}}
random 随机提取某个成员 {list | random}}
slice 按切片提取成员 {{list | slice:":-2"}}
truncatechars 按字符长度截取内容 {{content | truncatechars:30}}
truncatewords 按单词长度截取内容 同上

模板语法-标签(类似于流程控制)

语法结构
{% 名字 ...%}
{% end名字 %}
if判断与for循环
<!-- if判断 -->
{% if b %}
    <p>你好啊</p>
{% elif s1 %}
    <p>他好呀</p>
{% else %}
    <p>大家好</p>
{% endif %}

<!-- for循环 -->
{% for i in l1 %}
<p>{{i}}</p>
{% endfor %}

    提供了forloop关键字,可以在for循环前提下使用,forloop结果如下:
    结果x,{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}  <!-- 这是forloop的一条记录 -->
    	counter0:从零开始计算索引,当前元素的索引值
	counter:从1开始计算索引,当前元素的索引值
	revcounter:从1开始计算索引,将索引值反过来后当前元素的索引值
	revcounter0:从0开始计算索引,将索引值反过来后当前元素的索引值
	first:表示当前元素是否是第一个元素
	last:表示当前元素是否是最后一个元素
    ...
    <!-- for循环中forloop使用+if判断 -->
    {% for i in l1 %}
    {% if forloop.first %}
	    <p>这是第一次循环</p>
    {% elif forloop.last %}
	    <p>这是最后一次循环</p>
    {% else %}
	    <p>中间循环</p>
    {% endif %}
    {% empty %}  <!-- for循环对象为空时执行下面代码 -->
	    <p>for循环对象为空 自动执行</p>
    {% endfor %}

ps:针对字典同样提供了keys、values、items方法
    {% for foo in user_info %}
    	{{ foo }}  <!-- 默认取字典k值 -->
    {% endfor %}

    {% for foo in user_info.keys %}
    	{{ foo }}  <!-- 取字典所有k值 -->
    {% endfor %}

    {% for foo in user_info.values %}
    	{{ foo }}  <!-- 取字典所有v值 -->
    {% endfor %}

    {% for foo in user_info.items %}
    	{{ foo }}  <!-- 取字典所有键值对,元组形式 -->
    {% endfor %}

自定义过滤器、标签及inclusion_tag

"""
如果想要自定义一些模板语法 需要先完成下列的三步走战略
	1.在应用下创建一个名字必须叫templatetags的目录
	2.在上述目录下创建任意名称的py文件	
	3.在上述py文件内先编写两行固定的代码
		from django import template
		register = template.Library()
"""
# 自定义过滤器(最大只能接收两个参数)
@register.filter(name='myadd')
def func1(a, b):
    return a + b
{% load mytags %}
<p>{{ i|myadd:1 }}</p>


# 自定义标签(参数没有限制)
@register.simple_tag(name='mytag')
def func2(a, b, c, d, e):
    return f'{a}-{b}-{c}-{d}-{e}'
{% load mytags %}
{% mytag 'jason' 'kevin' 'oscar' 'tony' 'lili' %}



# 自定义inclusion_tag(局部的html代码)
@register.inclusion_tag('menu.html',name='mymenu')
def func3(n):
    html = []
    for i in range(n):
        html.append('<li>第%s页</li>'%i)
    return locals()
{% load mytags %}
{% mymenu 20 %}

模板的继承与导入

母板(模板)的继承
	多个页面有很多相似的地方 我们可以采取下列方式
    方式1:传统的复制粘贴 (代码重复性太高!浪费资源,而且不方便)
    方式2:模板的继承
        1.在母板中使用block划定子板可以修改的区域
        语法:
            {% block 区域名称 %}
            {% endblock %}
        2.子板继承模板
        	html页面清空
            首行编写: { % extend '母版名称.html' % }
            { % block 区域名称% } 
           		 子板的内容
                { % end block % }
        3.完全体
        	在母版中 应该至少划分三个区域
            1.页面内容区域
            2.CSS样式区
            3.JS代码区
        子板可以重复使用母版的内容
        	{{block.super}}
            
模板的导入(了解)
	将某个html的部分提前写好 之后很多html页面都想使用就可以导入
 		{% include 'myform.html' %}		    

标签:list,django,语法,索引,html,foo,模板
From: https://www.cnblogs.com/ddsuifeng/p/16982366.html

相关文章