Django模板层
目录
- 模板语法之过滤器
- 语法结构
- 常见过滤器
- 统计数据的长度
- 算术加法或者字符串加法
- 将数字转成合适的文件计量单位
- 判断当前数据对象对应的布尔值是否为False
- 时间格式化
- 索引切片
- 按照空格截取指定个数的文本
- 按照字符个数截取文本
- 移除指定的字符
- 是否取消转换
- 模板语法之标签
- 语法结构
- if判断
- for循环
- forloop关键字
- for+if混合使用
- 自定义过滤器、标签、inclusion_tag
- 自定义过滤器
- 自定义标签
- 自定义inclusion_tag
- 模板的导入
- 导入方法
- 模板的继承
- 先在模板中通过block划定能够修改的区域
- 子页面继承模板
- 修改划定的区域
- 子页面重复调用继承模板的内容
- 测试环境搭建
- ORM关键字使用
模板语法之过滤器
类似于内置函数,使用的时候多看源码
语法结构
{{ 数据对象|过滤器名称:参数 }} 过滤器只能额外传输一个参数
常见过滤器
django模板语法提供了60+过滤器,我们只需了解一些常用的过滤器
def test(request):
l1 = [111, 222, 333, 444, 555, 666]
n1 = 666
file_size1 = 1024
file_size2 = 10241024
dic = {'name': 'johnson', 'age': 22, 'nationality': 'Uk'}
s1 = 'django unstoppable!'
s2 = 'stephanie'
s3 = 'my name is tom my age is 22'
s4 = 'username^password'
b1 = False
tag1 = '我是二级标题
'
script1 = ""
html1 = ""
from django.utils.safestring import mark_safe
res = mark_safe(html1)
from _datetime import datetime
current_time = 20220328
return render(request, 'test.html', locals())
统计数据的长度
{{ s1|length }}
算术加法或者字符串加法
{{ n1|add:222 }}、{{ s1|add:'awesome' }}、{{ b1|add:'female' }}
将数字转成合适的文件计量单位
{{ file_size1|filesizeformat }}、{{ file_size2|filesizeformat }}
判断当前数据对象对应的布尔值是否为False
{{ s2|default:'第一个值对应的布尔值是False' }}、{{ b1|default:'第一个值对应的布尔值是False' }}
时间格式化
{{ current_time|date:'Y-m-d' }}
索引切片
{{ s1|slice:'0:12' }}{{ s2|slice:'2:6' }}
按照空格截取指定个数的文本
{{ s3|truncatewords:3 }}、{{ s1|truncatewords:1 }}
按照字符个数截取文本
注意:包含三个点
{{ s2|truncatechars:10 }}、{{ s3|truncatechars:10 }}
移除指定的字符
{{ s4|cut:'^' }}
是否取消转换
{{ tag1 }}、{{ tag1|safe }}、{{ scripts1|safe }}、{{ res }}
注意:safe提供了django开发全栈项目前端页面代码(主要是HTML代码)可以在后端编写的方法
模板语法之标签
语法结构
{% 关键字 ...%}
{% end关键字 %}
if判断
{% if b1 %}
if条件成立
{% elif l1 %}
elif条件成立
{% else %}
上述条件均不成立
{% endif %}
点击查看效果图
for循环
forloop关键字
{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}
{% for foo in l1 %}
{{ foo }}
{% endfor %}
{% for foo1 in dic %}
{{ foo1}}
{% endfor %}
{% for foo in l1 %}
{% if forloop.first %}
这是第一次循环
{% endif %}
{% if forloop.last %}
这是最后一次循环
{% endif %}
{{ foo }}
{% endfor %}
for+if混合使用
{% for foo in l1 %}
{{ foo }}
{% if forloop.first %}
这是第一次循环
{% endif %}
{% if forloop.last %}
这是最后一次循环
{% else %}
这是中间循环
{% endif %}
{% empty %}
循环对象为空
{% endfor %}
# 针对字典django模板语法同样提供了keys、values、items方法
{% for foo in dic.keys %}
{{ foo }}
{% endfor %}
{% for foo1 in dic.values %}
{{ foo1 }}
{% endfor %}
{% for foo2 in dic.items %}
{{ foo2 }}
{% endfor %}
自定义过滤器、标签、inclusion_tag
自定义过滤器
只能接收两个参数
@register.filter(is_safe=True)
def func(x, y):
return x+y
{% load custom_tag %}
{{ n1|func:333 }}
点击查看效果图
自定义标签
可以接收任意的参数
@register.simple_tag(name='customize_tag')
def func1(a, b, c, d, e, f, g):
return a + b + c + d + e + f + g
{% load custom_tag %}
{% customize_tag 11 22 33 44 55 66 77 %}
点击查看效果图
自定义inclusion_tag
@register.inclusion_tag('custom_inclusion_tag.html')
def func2(n):
l1 = []
for i in range(1, n + 1):
l1.append(f'第{i}页')
return locals()
# custom_inclusion_tag.html
{% for foo in l1 %}
-
{{ foo }}
{% endfor %}
点击查看效果图
模板的导入
导入方法
{% include 'base.html' %}
模板的继承
类似于面向对象的继承:继承了某个页面就可以使用该页面上所有的数据和功能
先在模板中通过block划定能够修改的区域
{% block content %}
主页内容
{% endblock %}
{% block css %}
{% endblock %}
{% block js %}
{% endblock %}
子页面继承模板
{% extends 'base.html' %}
修改划定的区域
{% block content %}
登陆页面
{% endblock %}
子页面重复调用继承模板的内容
{% block content %}
{{ block.super }}
登陆页面
{% endblock %}
{% block js %}
{% endblock %}
注意:模板上最少应该有三个区域
css区域、内容区域、js区域
子页面才能有有自己专属的css、js、内容
测试环境搭建
class UserInfo(models.Model):
uid = models.AutoField(primary_key=True)
name = models.CharField(max_length=42)
gender = models.CharField(max_length=12)
age = models.IntegerField(max_length=3)
register_time = models.DateField(auto_now=True)
# 对象被执行打印操作自动触发
def __str__(self):
return '对象:%s' % self.name
# 测试代码
from django.test import TestCase
# Create your tests here.
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day54.settings")
import django
django.setup()
from app01 import models
models.UserInfo.objects.create(name='linda', age=22, gender='female')
models.UserInfo.objects.create(name='tom', age=24, gender='male')
models.UserInfo.objects.create(name='sam', age=20, gender='female')
models.UserInfo.objects.create(name='david', age=22, gender='male')
models.UserInfo.objects.create(name='jobs', age=24, gender='male')
models.UserInfo.objects.create(name='july', age=20, gender='female')
ORM关键字使用
# query = models.UserInfo.objects.all() # 查询所有的数据
# query = models.UserInfo.objects.filter() # 括号内填写筛选条件,参数为空相当于all()
# query = models.UserInfo.objects.filter(pk=2) # pk字段自动定位到当前表的主键字段
# query = models.UserInfo.objects.filter(pk=3)[0] # 直接获取数据对象
# query = models.UserInfo.objects.filter(pk=4).first() # 获取结果集中第一个对象
# query = models.UserInfo.objects.filter(pk=5, name='sam').first() # 括号内支持填写多个筛选条件,默认是and关系
# query = models.UserInfo.objects.filter().filter().filter().filter() # 类似于jQuery链式操作
# query = models.UserInfo.objects.filter().last() # 获取结果集中最后一个对象
# query = models.UserInfo.objects.all().values('name', 'gender') # QuerySet 可当作是列表套字典
# query = models.UserInfo.objects.values('name', 'gender') # 指定字段all为空也表示查询所以数据
# query = models.UserInfo.objects.filter(pk=2).values('name') # 可当作是对结果集进行字段的筛选
# query = models.UserInfo.objects.all().values_list('name', 'age') # QuerySet 可当作是列表套元组
# query = models.UserInfo.objects.all().distinct() # 数据对象中如果包含主键不能去重
# query = models.UserInfo.objects.values('name').distinct()
# query = models.UserInfo.objects.order_by('age') # 默认是升序
# query = models.UserInfo.objects.order_by('-age') # 该为降序
# query = models.UserInfo.objects.order_by('age', 'pk') # 支持多个字段依次排序
# query = models.UserInfo.objects.exclude(gender='male') # 取反操作
# query = models.UserInfo.objects.reverse() # 没有效果
# query = models.UserInfo.objects.order_by('age').reverse() # 只有在order_by排序之后才可以
# query = models.UserInfo.objects.order_by('age')
# query = models.UserInfo.objects.count() # 统计结果集的个数
# query = models.UserInfo.objects.exists()
# query = models.UserInfo.objects.filter(name='trump').exists() # 判断结果集中是否有数据,返回布尔值
# query = models.UserInfo.objects.get(pk=2) # 直接获取数据对象,找不到会报错
# query = models.UserInfo.objects.get(pk=7) # 不存在直接报错
# query = models.UserInfo.objects.filter(pk=1) # 获取数据对象,找不到返回空列表
# query = models.UserInfo.objects.filter(pk=7) # 不存在返回空列表
# print(query)