模板层之过滤器、模板层之标签、继承与导入、模型层之ORM常用关键字

  • 模板层

  • 模板语法之过滤器(内置函数)

  • 模板层之标签(流程控制)

  • 自定义过滤器、标签及inclusion_tag(了解)

  • 模板的继承与导入

  • 模型层之前期准备

  • ORM常用关键字

  • 模板层

"""
django提供的模板语法只有两个符号
	{{}}:主要用于数据值相关操作(引用)
	{%%}:主要用于逻辑相关操作(循环、判断)
	
django的模板语法是自己写的 跟jinja2不一样
1.针对需要加括号调用的名字 django模板语法会自动加括号调用你只需要写名字就行
2.模板语法的注释前端浏览器是无法查看的 {##}
"""

# 模板语法传值的两种方式
传值方式1:精准传值 不浪费资源 针对多资源的传递书写麻烦
     name = 'gavin'
 return render(request, 'mb_a文件.html',{'name':name})

传值方式2:将函数名称空间中所有的名字全部传递 名字过多并且不使用的情况下比较浪费资源
return render(request, 'ab_temp.html', locals())
'''locals() 将当前名称空间中所有的名字全部传递给html页面'''

# 模板语法传值特性
1.基本数据类型正常展示
2.文件对象也可以展示并调用方法
3.函数名会自动加括号执行并将返回值展示到页面上(不支持额外传参)
4.类名也会自动加括号调用
5.对象则不会	
ps:总结针对可以加括号调用的名字模板语法都会自动加括号调用

模板语法之过滤器(内置函数)

过滤器 用法 代码
last 获取列表/元组的最后一个成员 {{liast | last}}
first 获取列表/元组的第一个成员 {{list|first}}
length 获取数据的长度 {{list | length}}
defualt 当变量没有值的情况下, 系统输出默认值, {{str|default="默认值"}}
safe 让系统不要对内容中的html代码进行实体转义 {{htmlcontent| safe}}
upper 字母转换成大写 {{str | upper}}
lower 字母转换成小写 {{str | lower}}
title 每个单词首字母转换成大写 {{str | title}}
date 日期时间格式转换 `{{ value
cut 从内容中截取掉同样字符的内容 {{content | cut:"hello"}}
list 把内容转换成列表格式 {{content | list}}
add 加法 {{num| add}}
filesizeformat 把文件大小的数值转换成单位表示 {{filesize | filesizeformat}}
join 按指定字符拼接内容 {{list| join("-")}}
random 随机提取某个成员 {list | random}}
slice 按切片提取成员 {{list | slice:":-2"}}
truncatechars 按字符长度截取内容 {{content | truncatechars:30}}
truncatewords 按单词长度截取内容 同上

模板层之标签(流程控制)

"""
django模板语法中写标签的时候,只需要写关键字然后tab键就会自动补全
"""
# if判断
{% if 条件1(可以自己写也可以用传递过来的数据) %}
         <p>阳了个阳</p>
{%elif 条件2(可以自己写也可以用传递过来的数据)%}
          <p>羊了个羊</p>
{% else %}
          <p>小阳人</p>
{% endif %}

# for循环
l1 = [11,22, 33, 44, 55]
{% for k in l1 %}
    <p>{{ forloop }}<p>
{% endfor %}
# forloop对象

image

# for + if使用
{% for k in t1 %}
        {% if forloop.first %}
            <p>这是我的第一次循环{{ k }}</p>
        {% elif forloop.last %}
            <p>这是我的最后一次循环{{ k }}</p>
        {% else %}
            <p>这是中间循环{{ k }}</p>
        {% endif %}
        
        {% empty %}
            <p>你给我传的数据是空的无法循环取值(空字符串、空列表、空字典)</p>
{% endfor %}

image

image

django模板语法取值操作>>>:只支持句点符
    句点符既可以点索引也可以点键
d1 = {'name': 'jason', 'age': 20,'hobby':['read','music',{'a1':'嘻嘻','a2':'哈哈'}]}

	 {{ d1.hobby.2.a1 }}

image

# 复杂数据获取之后需要反复使用可以起别名
{% with d1.hobby.2.a1 as h %}
{{ h }}
{% endwith %}

自定义过滤器、标签及inclusion_tag(了解)

"""
如果想要自定义一些模板语法 需要先完成下列的三个步骤
     1.在应用下创建一个名字必须叫templatetags的目录
     2.在上述目录下创建任意名称py文件
     3.在上述py文件内先编写两行固定的代码
       from django import template
       register = template.Library()
"""

# 自定义过滤器(最大只能接收两个参数)
@register.filter(name='myadd')
def func1(a, b):
    return a + b
{% load mytags %}
<p>{{ i|myadd:1 }}</p>


# 自定义标签(参数没有限制)
@register.simple_tag(name='mytag')
def func2(a, b, c, d, e):
    return f'{a}-{b}-{c}-{d}-{e}'
{% load mytags %}
{% mytag 'jason' 'kevin' 'oscar' 'tony' 'lili' %}



# 自定义inclusion_tag(局部的html代码)
@register.inclusion_tag('menu.html',name='mymenu')
def func3(n):
    html = []
    for i in range(n):
        html.append('<li>第%s页</li>'%i)
    return locals()
{% load mytags %}
{% mymenu 20 %}

模板的继承与导入

  • 模板的继承(重要)
多个html页面有很多相似的地方 我们可以采取下列方式
方式1:
    传统的复制粘贴
    
方式2:
    模板的继承
# 在模块中使用block划定子模版以后可以修改的区域
{% block 区域名称 %}
	模板样式
{% endblock %}

image

# 子模版继承模板
{% extends 父模板名称 %}

{% block 区域名称 %}
  子板自己的内容
{% endblock %}

image

ps:模板中至少应该有三个区域
    页面内容区、css样式区、js代码区
    补充:子板也可以继续使用模板的内容 
        {{ block.super }}
  • 模板的导入(了解)
# 类似于将html页面上的局部页面做成模块的形式 哪个地方想要直接导入即可展示
方法一: 直接拷贝
方法二: 模板的导入
    使用方式
	{% include 'menu.html' %}

模型层之前期准备

'''
自带的sqlite3数据库对时间字段不敏感 有时候会展示错乱 所以我们习惯切换成常见的数据库比如MySQL 
django ORM并不会自动帮你创建库 所以需要提前准备好
'''
# 创建库
create database 库名;

# 修改sittings.py配置文件
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db2',
        'USER': 'root',
        'PASSWORD': '123',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'CHARSET': 'utf8'
    }
}

# 在models.py中创建模型类
class User(models.Model):
    name = models.CharField(max_length=32, verbose_name='用户名')
    age = models.IntegerField(verbose_name='年龄')
    register_time = models.DateTimeField(verbose_name='注册时间', auto_now=True)
    '''
    针对时间字段有两个重要参数
        auto_now:每次操作数据都会自动更新当前时间
        auto_now_add:创建数据自动获取当前时间 后续修改不人为操作的情况下不会更新
    '''

    def __str__(self):
        return f'用户对象{self.name}'
    '''
    双下str
    对象在被执行打印操作的时候自动触发 该方法返回什么打印的结果就是什么
    在打印对象的时候名字便于查看
    '''
    
# 执行数据库迁移相关命令
python39 manage.py makemigrations
python39 manage.py migrate

image

# 单独测试django某个功能层
默认不允许单独测试某个py文件 如果想要测试某个py文件(主要是model.py)
测试环境1:pycharm提供的python console
    
测试环境2:自己搭建(自带的test或者自己创建)
    1.拷贝manage.py前四行
    2.自己再加两行
        import django
        django.setup()

image

# django orm底层还是SQL语句 我们是可以查看的
如果我们手上是一个QuerySet对象 那么可以直接点query查看SQL语句

image

如果想查看所有orm底层的SQL语句也可以在配置文件添加日志记录
在Django项目的settings.py文件中,在最后复制粘贴如下代码:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

ORM常用关键字

create() 创建数据

# create()  创建数据并直接获取当前创建的数据对象

res = models.User.objects.create(name='sam', age=41)
print(res)

image

filter()筛选数据

# filter()根据条件筛选数据 结果是QuerySet [数据对象1,数据对象2]

res = models.User.objects.filter()  # 默认查所有
res = models.User.objects.filter(name='jason')  # 指定查jason数据对象
res = models.User.objects.filter(name='jason',age=18)  # 括号内支持多个条件但是默认是and关系

image

res = models.User.objects.filter()[1]  # 根据索引值查找索引值为1的数据对象
res = models.User.objects.filter(pk=100)[0]  # 数据不存在索引取值会报错

image

first() last() 返回第一条数据/返回最后一条数据

# first() last() QuerySet支持索引取值但是只支持正数 并且orm不建议你使用索引

res = models.User.objects.filter(pk=100).first()  # 数据不存在不会报错而是返回None
res = models.User.objects.filter(pk=100).last()  # 数据不存在不会报错而是返回None

image

update() 更新数据

# update()  更新数据(批量更新)

models.User.objects.filter().update()     批量更新
models.User.objects.filter(id=1).update() 单个更新

delete() 删除数据

# delete()  删除数据(批量删除)

models.User.objects.filter().delete()      批量删除
models.User.objects.filter(id=1).delete()  单个删除

image

all() 查询所有数据

# all() 查询所有数据  结果是QuerySet [数据对象1,数据对象2]

res = models.User.objects.all()

image

values() 根据指定字段获取数据

# values()  根据指定字段获取数据 结果是QuerySet [{},{},{},{}]

res = models.User.objects.all().values('name')  # 获取所有数据的name字段对应的值
res = models.User.objects.filter().values()
res = models.User.objects.values()

image

values_list() 根据指定字段获取数据

# values_list() 根据指定字段获取数据  结果是QuerySet [(),(),(),()]

res = models.User.objects.all().values_list('name','age')

image

distinct() 去重

# distinct() 去重 数据一定要一模一样才可以 如果有主键肯定不行

res = models.User.objects.values('name','age').distinct()

order_by() 根据指定条件排序

# order_by()  根据指定条件排序  默认是升序 字段前面加负号就是降序

res = models.User.objects.all().order_by('age')

get() 根据条件筛选数据并直接获取到数据对象

# get()  根据条件筛选数据并直接获取到数据对象  一旦条件不存在会直接报错 不建议使用

res = models.User.objects.get(pk=1)
res = models.User.objects.get(pk=100, name='jason')

exclude() 取反操作

# exclude()  取反操作
res = models.User.objects.exclude(pk=1)

reverse() 颠倒顺序

# reverse()  颠倒顺序(被操作的对象必须是已经排过序的才可以)

res = models.User.objects.all()
res = models.User.objects.all().order_by('age')
res1 = models.User.objects.all().order_by('age').reverse()

count() 统计结果集中数据的个数

# count()  统计结果集中数据的个数

res = models.User.objects.all().count()

exists() 判断结果集中是否含有数据

# exists()  判断结果集中是否含有数据 如果有则返回True 没有则返回False

res = models.User.objects.all().exists()
res1 = models.User.objects.filter(pk=100).exists()
posted @ 2022-12-14 23:27  Super小赵  阅读(35)  评论(0编辑  收藏  举报
****************************************** 页脚Html代码 ******************************************