模板层语法传值
# 1.模板语法传值有两种方式
{{}}: 主要与数据值有关的传值
{%%}: 主要与逻辑相关的传值
"""django的模板语法是自己写的,与jinja2不同"""
-1.针对于需要加括号调用的名字,django模板语法填写无需加括号,只写名字就会直接调用
-2.模板语法的注释无法在前端查看到
注释语法: {##}
# 2.模板语法传值
传值方式1:精准传值不浪费资源,但是对于传递值多的比较麻烦
return render(request, 'html页面',{'name': name, 'age' = age})
传值方式2:将函数名称空间中所有的名字全部传递出去,但是名字过多,用到较少时比较浪费资源
return render(request, 'html页面',locals())
模板层语法传值特性
# 1.基本数据类型正常展示
八大基本数据类型
# 2.文件对象也可以展示并调用方法
视图层views:
file_obj = open(r'文件路径', 'rb')
前端模板语法:
<p>{{ file_obj }}</p> # 展示文件信息
<p>{{ file_obj.read }}</p> # 读取文件内容
# 3.函数名会自动加括号执行并将返回值展示到页面上(不可以额外传参)
视图层views:
def func():
print('一二三四五六七')
return '谁写代码谁sb'
前端模板语法:
<p>{{ func1 }}</p>
# 4.类名也是自动加括号调用,对象不会自动加括号调用
视图层views:
class MyClass(object):
def get_obj(self):
return '绑定给对象的方法'
@classmethod
def get_cls(cls):
return '绑定给类的方法'
@staticmethod
def get_static():
return '静态方法'
obj = MyClass()
前端模板语法:
<p>{{ MyClass }}</p>
<p>{{ obj }}</p>
<p>{{ obj.get_obj }}</p>
<p>{{ obj.get_cls }}</p>
<p>{{ obj.get_static }}</p>
ps:针对可以加括号的名字模板语法都会自动加括号调用
模板语法之过滤器
<p>{{ i|add:10 }}</p> # 两个都是整型就是就是数字加起来
<p>{{ s|add:'baby' }}</p> # 两个都是字符串就是拼接
<p>{{ l|length }}</p> # 显示出l的字符长度
<p>{{ s|slice:'1:4' }}</p> # 对s的字符进行切片1~4
<p>{{ s|truncatechars:5 }}</p> # 按照字符展示相应位数 ...计算在内
<p>{{ s|truncatewords:3 }}</p> # 按照空格展示相应的单词数
<p>{{ ctime|date:'Y年-m月-d日 H时:i分:s秒 ' }}</p> # 展示格式化时间,注意分钟的代表
<p>{{ file_size|filesizeformat }}</p> # 换算对象的大小(kb,mb...)
<p>{{ h1|safe }}</p> # safe会开启前端的识别,识别后h1 = '<h1>哈哈哈哈</h1>'就会变为标题 哈哈哈哈
<p>{{ s1|safe }}</p>
模板层之标签
# 1.模板语法标签
-1. if相关:
{% if 条件1(可以自己写也可以用传递过来的数据) %}
条件1成立执行的代码
{% elif 条件2(可以自己写也可以用传递过来的数据) %}
条件2成立执行的代码
{% else %}
条件都不成立执行的代码
{% endif %}
-2. for相关:
{% for i in s %}
{% if forloop.first %}
<p>第一次for循环</p>
{% elif forloop.last %}
<p>最后一次for循环</p>
{% else %}
<p>中间的循环{{ i }}</p>
{% endif %}
{% empty %}
<p>传过来的数据是空的,不能for循环</p>
{% endfor %}
# django模板语法取值只支持句点符,句点符既可以点索引也可以点键。
例: {{ s1.hobby.1.music}}
# 复杂数据的获取可以起别名
{% with s1.hobby.1.music as a1 %}
<a href="">{{ a1 }}</a>
{% endwith %}
自定义过滤器
# 1.如果想要自定义标签函数,需要先准备一些事情
-1.在应用下创建一个文件夹名字为templatetags
-2.在temolatetags文件夹创建任意名字的py文件
-3.在py文件中内部编写自定义相关代码
-4.在py文件内导入固定代码
form django.template import library
register = Library()
&
from django import template
register = template.Library()
# 2.自定义过滤器(最大只能接收两个参数)
@register.filter(name='myadd')
def func1(a, b):
return a+b
{% load mytags %}
<p>{{ i|myadd:1 }}</p>
# 3.自定义标签(参数没有限制)
@register.simple_tag(name='mt')
def func2(a, b, c, d):
return a + b + c + d
{% load mytags %}
{% mt 'jason' 'kevin' 'oscar' 'tony' 'lili' %}
# 4.自定义inclusion_tag(局部的html代码)
@register.inclusion_tag(filename='it.html')
def index(n):
html = []
for i in range(n):
html.append('第%s页'%i)
return locals()
# 在HTML页面上调用一个inclusion_tag,其会作用于一个html页面(局部),将其插入原来调用的位置
{% load mytags %}
{% index 10 %}
模板的继承于导入
# 1.模板的继承
"""多个页面有许多相似的地方,所以需要用到继承(只适合前后端混合的项目)"""
空的HTML文件:
{% extends 'html文件名' %} # 全部继承
-1.模板中使用block划定子板后可以修改的区域
改一个页面需要在原模版上提前做好标记
{% block 名字 %} # 标记未来继承时要修改的
模板内容
{% endblock %}
-2.子模版继承
继承的页面,先继承全部
{% block 名字 %} # 要修改的子模版代码(修改后)
子模版内容
{% endblock %}
-3.一般模板上有三个区域可以使拓展性更高
css样式:
{% block css %}
{% endblock %}
html标签内容
{% block content %}
{% endblock %}
js代码
{% block js %}
{% endblock %}
-4.子板中还可以使用母板的内容
{{ block.super }}
# 2.模板的导入
-1.把html页面某个部分当作模块的形式导入使用
{% include 'menu.html' %}