Django微讲解(五)
模板语法过滤器、标签、模板的继承
Django微讲解(五)
模板语法
1.过滤器(类似于内置函数)
# 1.语法结构 {{数据对象|过滤器名称:参数}} # 过滤器最多只能额外传输一个参数 # 2.常见过滤器 {{ s1|length }} # 统计数据的长度 {{ s1|add:'111' }} # 算数加法或者是字符串加法 {{ s2|filesizeformat }} # 将数字转成合适的文件计量单位 判断当前数据对象对应的布尔值: {{ s3|default:'前面的值对应的是False就会打印' }} {{ s4|default:'前面的值对应的是Ture就会打印前面的值' }} {{ ctime|date:'Y-m-d' }} # 2022-05-16,时间格式化 {{ s1|slice:'0:5' }} # 索引切片 {{ s5|truncatewords:3 }} # 按照空格截取指定文本 {{ s5|truncatechars:7 }} # 按照字符个数截取文本,包括后面的三个点 {{ s5|cut:' ' }} # 取消指定字符 {{ s6|safe }} # 是否取消转换,意思就是如果一个变量存的是一个HTML语句,想要在前端页面展示出效果,就可 以使用这一个方法 ''' 是否取消转换的后端写法: from django.utils.safestring import mark_safe s6 = '<h1>取消转义</h1>' res = mark_safe(s6) '''
2.标签
# 1.语法结构 {% 名字 ...%} {% end名字 %} 在Django模板语法中写标签的时候,只需要写关键字然后按tab键就会自动补全 # 2.if判断 {% if 条件1 %} 子代码 {% elif 条件2 %} 子代码 {% else %} 子代码 {% endif %} # 3.for循环 {% for i in res %} {% endfor %} for循环还提供了一个forloop关键字,输出的结果是: {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 2, 'revcounter0': 1, 'first': True, 'last': False} counter0表示从0开始计数,counter表示从1开始计数,first表示是否是第一次for循环,last表示是否是最后 一次for循环。 for循环还可以与if判断连用,针对字典for循环同样提供了keys、values、items方法
3.自定义过滤器、标签、inclusion_tag
# 1.自定义前的准备 1.在应用下创建一个名为templatetags的文件夹 2.在该文件夹内创建一个任意名称的py文件 3.在该py文件先编写两行固定的代码 from diango import template register = template.Library() # 2.自定义过滤器 @register.filter(is_safe=True) def func1(a, b): return a + b {% load mytag %} {{ n1|func1:'666' }} # 3.自定义简单标签,可以接收任意的参数 @register.simple_tag(name='my_tag') def func2(a, b, c, d): return a + b + c + d {% load mytag %} {% my_tag 1 2 3 4 %} # 参数之间空格隔开即可 # 4.自定义inclusion_tag 该方法需要先作用与一个局部页面,之后将渲染的结果放到调用的位置 @register.inclusion_tag('home.html') # 作用于页面 def func3(n): l1 = [] for i in range(1,1+n): l1.append(f'第{i}页') return locals() # home.html代码,只需要这些代码即可,HTML页面上多余的删掉即可 <ul> {% for foo in l1 %} <li>{{ foo }}</li> {% endfor %} </ul> # 前端页面代码 {% load mytag %} {% func3 10 %}
模块的导入及注释语法
# 1.模块导入 类似于将HTML页面上的局部页面做成模块的形式,哪个地方需要直接导入即可 示例:{% include 'HTML文件' %} # 2.注释语法 1.HTML注释语法:<!----> 2.Django模板语法注释语法:{##} HTML的注释语法可以在前端浏览器页面上直接查看,模板语法的注释只能在后端查看,前端浏览器查看不了
模板的继承
有很多网站的页面,大致都是一样的,只是局部有所变化,我们就可以使用模板的继承来实现该需求,模板的继承 类似于面向对象的继承,继承了某个页面就可以使用该页面的所有资源。 # 1.现在模板中通过block划定可以被修改的区域 {% block content %} 可以修改的内容 {% endblock %} # 2.子模板继承模板 {% extends 'HTML文件' %} # HTML文件也就是模板的文件 # 3.修改划定的区域 {% block content %} 修改的内容 {% endblock %} # 4.子模板还可以重复使用模板的内容 {{ block.super }}
前期数据准备
# 1.创建数据库和表 class Users(models.Model): uid = models.AutoField(primary_key=True) name = models.CharField(max_length=255) age = models.IntegerField() op_time = models.DateTimeField(auto_now=True) # 年月日字段 ''' auto_now:每次修改数据的时候都会自动修改当前时间 auto_now_add:在数据被创建出来的时候会自动记录当前时间,之后不人为修改的情况下保持不变 ''' # 2.记录数据库的操作 1.数据库正向迁移命令(将类操作映射到表中) python manage.py makemigrations python manage.py migrate 2.数据库反向迁移命令(将表映射成类) python manage.py inspectdb # 3.搭建测试环境 当我们在想要在本地的Django项目中做测试,那么我们就需要有专门的测试环境,因为Django是一个整体,不允许 单独操作某个文件 1.自己搭建测试环境 import os if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangofour.settings") import django django.setup() '''在下面写测试代码''' 2.pycharm提供 点击pycharm下方的Python Console会自动进入测试环境
ORM常见操作关键字
# 1.all 查询所有数据,返回的QuerySet可以看出是列表套对象 res = models.Users.objects.all() # 2.filter 1.括号内填写筛选条件,不填写筛选条件相当于all,返回的QuerySet可以看出是列表套对象 res = models.Users.objects.filter() 2.想通过主键筛选数据,可以直接写pk,会在自动定位到当前列表的主键字段,无需自己查看具体字段名称 res = models.Users.objects.filter(pk=1) 3.获取结果集中第一个对象,推荐使用封装的first方法,不会出现索引超出范围报错的情况 res = models.Users.objects.filter(pk=1).first() 4.括号内支持填写多个筛选条件,默认是and关系 res = models.Users.objects.filter(pk=1,name='oscar').first() 5.只要是QuerySet对象就可以继续点对象方法,类似于jQuery链式操作 6.获取结果集中最后一个对象 res = models.Users.objects.filter().last() # 3.values 1.QuerySet可以看成是列表套字典 res = models.Users.objects.all().values('name','age') 2.指定字段,不写all也表示从所有数据中操作 res = models.Users.objects.values('name','age') 3.对结果集字段进行筛选 res = models.Users.objects.filter(pk=1).values('name') 4.QuerySet可以看成是列表套元组 res = models.Users.objects.all().values_list('name','age') # 4.去重 数据对象中如果含有主键,不能去重 res = models.Users.objects.all().distinct() res = models.Users.objects.values('name').distinct() # 对指定字段去重 # 5.排序 res = models.Users.objects.order_by('age') # 默认是升序 res = models.Users.objects.order_by('-age') # 降序 res = models.Users.objects.order_by('age','pk') # 支持多个字段依次排序 # 5.取反操作 res = models.Users.objects.exclude(name='oscar') # 6.对查询结果反向排序,只有在order_by排序之后才可以 res = models.Users.objects.order_by('age').reverse() # 7.统计结果集中的个数 res = models.Users.objects.count() # 8.判断结果集中是否含有数据,结果返回布尔值 res = models.Users.objects.filter(name='oscar').exists() # 有了就返回True,没有就返回False
这里是IT小白陆禄绯,欢迎各位大佬的指点!!!
__EOF__
本文作者:陆禄绯
本文链接:https://www.cnblogs.com/pyqsy/p/16278574.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/pyqsy/p/16278574.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧