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 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   陆禄绯  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示