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小白陆禄绯,欢迎各位大佬的指点!!!

posted @ 2022-05-16 21:15  陆禄绯  阅读(50)  评论(0编辑  收藏  举报