django之模板层
django之模板层
模板语法之过滤器
语法结构
{{数据对象|过滤器名称:参数}} 过滤器最多只能额外传输一个参数
常见过滤器
1.统计数据的长度 length
# views.py 层
def index(request):
s = '哈哈哈哈'
return render(request, 'index.html',locals())
# index 页面
<p style="font-size: 30px">{{ s|length }}</p>
2.算术加法或者字符串加法 add
# index页面
<p style="font-size: 30px">{{ s|add:'你好' }}</p>
3.将数字转换成合适的文件计量单位 filesizeformat
# views.py 视图层
def index(request):
s = '哈哈哈哈'
file_size = 22222
return render(request, 'index.html',locals())
# index 页面
<p style="font-size: 30px">{{ file_size|filesizeformat }}</p>
4.判断当前数据对象对应的布尔值是否是False
# index 页面
<p style="font-size: 30px">{{ s|length }}</p>
<p style="font-size: 30px">{{ file_size|filesizeformat }}</p>
<p style="font-size: 30px">{{ b|default:'判断前面的值是否为FLASE' }}</p>
# views.py 视图层
def index(request):
s = '哈哈哈哈'
file_size = 22222
b = False
return render(request, 'index.html',locals())
判断一个变量的值是false还是True。如果值为false 则显示default后面的内容 反之,则显示原来的内容
5.时间格式化 date
# html 页面
<p style="font-size: 30px">{{ c_time|date:'Y-m-d'}}</p>
# views.py 视图层
from datetime import datetime
c_time = datetime.today()
6. 索引切片 slice
<p style="font-size: 30px">{{ s|slice:'0:2'}}</p>
7.按照空格截取指定个数的文本 truncatewords
# html 页面
<p style="font-size: 30px">{{ s|truncatewords:1 }}</p>
# views.py 视图层
s = '哈哈哈哈 hello world'
8.按照字符个数截取文本(包含三个点)
<p style="font-size: 30px">{{ s|truncatechars:8}}</p>
9. 移除指定的字符 cut
# html
<p style="font-size: 30px">{{ info|cut:'|'}}</p>
# views.py 视图层
info = 'jason|123|male'
10.是否取消转换 safe
1. 没转换之前
# html 页面
<p style="font-size: 30px">{{ tag}}</p>
# views.py 视图层
tag = '<h1>这是一个h1标签</h1>'
2.转换之后
<p style="font-size: 30px">{{ tag|safe}}</p>
# views.py 视图层
tag = '<h1>这是一个h1标签</h1>'
当然这是在html页面上加约束,也可以在后端加约束 eg:
# html 页面
<p style="font-size: 30px">{{ res}}</p>
# views.py 视图层
from django.utils.safestring import mark_safe
back_tag = '<h1>这是一个h1标签</h1>'
res = mark_safe(back_tag)
模板语法之标签
1.语法结构
{% 名字 ... %}
{% end名字%}
2.if 判断
{% if 条件1 %}
<p>你好啊</p>
{% elif 条件2 %}
<p>他好呀</p>
{% else %}
<p>大家好</p>
{% endif %}
3.for 循环
# forloop 关键字
{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}
# html 页面
{% for foo in l1 %}
{% if forloop.first %}
<p>这是第一次循环</p>
{% elif forloop.last %}
<p>这是最后一次循环</p>
{% else %}
<p>中间循环</p>
{% endif %}
{% empty %}
<p>当前循环对象为空</p>
{% endfor %}
同样支持字典
# html 页面
{% for foo in user_dict %}
{{ foo }}
{% endfor %}
{% for foo in user_dict.keys %}
{{ foo }}
{% endfor %}
{% for foo in user_dict.items %}
{{ foo }}
{% endfor %}
# views.py 视图层
user_dict = {'name':'jason','pwd':123}
自定义过滤器、标签、inclusion_tag
自定义过滤器的前提
"""
1.在应用下需要创建一个名为templatetags的文件夹
2.在该文件夹内创建一个任意名称的py文件
3.在该py文件内需要先提前编写两行固定的代码
from django import template
register = template.Library()
"""
自定义过滤器:只能接收两个参数
{% load mytag %}
{{ n1|my_index:666 }}
# mytag.py 文件内写以下内容
@register.filter(is_safe=True,name='my_index')
def index(a,b):
return a + b
自定义简单标签:可以接收任意的参数
# mytag.py 文件内写以下内容
@register.simple_tag(name='mytag')
def func(a,b,c,d):
return a+b+c+d
# html 文件
{% load mytag %}
{% mytag 1 2 3 4 %}
自定义inclusion_tag
# mytag.py 内的代码
@register.inclusion_tag('left.html')
def func(n):
l1 = []
for i in range(1,n+1):
l1.append(f'第{i}页')
return locals()
# left.html 文件
<ul>
{% for foo in l1 %}
<li>{{ foo }}</li>
{% endfor %}
</ul>
# index.html 文件
{% load mytag %}
{% func 10 %}
该方法需要先作用于一个局部html页面 之后将渲染的结果放到调用的位置
模板的继承
类似于面向对象的继承:继承了某个页面就可以使用该页面上所有的资源
有很多网站的很多页面 其实都是差不多的 只是局部有所变化 模板的继承可以很好的实现该需求
1.先在模板中通过block划定将来可以被修改的区域
{% block content %}
<h1>主页内容</h1>
{% endblock %}
2.子板继承模板
{% extends 'home.html' %}
3.修改划定的区域
{% block content %}
<h1>登录内容</h1>
{% endblock %}
4.子页面还可以重复使用父页面的内容
{{ block.super }}
"""
模板上最少应该有三个区域
css区域、内容区域、js区域
子页面就可以有自己独立的css、js、内容
"""
模板的导入
类似于将html页面上的局部页面做成模块的形式 哪个地方想要直接导入即可展示
eg:有一个非常好看的获取用户数据的页面 需要在网站的多个页面上使用
策略1:拷贝多份即可
策略2:模板的导入
使用方式 如下:
# index.html
{% include 'home.html' %}
{% include 'home.html' %}
{% include 'home.html' %}
注释语法补充
<!----> 是HTML的注释语法
{##} 是django模板语法的注释
"""
HTML的注释可以在前端浏览器页面上直接查看到
模板语法的注释只能在后端查看 前端浏览器查看不了
"""
测试环境搭建
前期数据准备
"""
django自带的sqlite3数据库 功能很少 并且针对日期类型不精确
1.数据库正向迁移命令(将类操作映射到表中)
python3 manage.py makemigrations
python3 manage.py migrate
2.数据库反向迁移命令(将表映射成类)
python3 manage.py inspectdb
"""
需求
我们只想操作orm 不想使用网络请求
需要有专门的测试环境
1.自己搭建
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day54.settings")
import django
django.setup()
2.pycharm提供
python console