其他分享
首页 > 其他分享> > Django day05(过滤器、标签、模板、orm关键字)

Django day05(过滤器、标签、模板、orm关键字)

作者:互联网

目录

模板语法之过滤器

类似于内置函数

1.语法结构

{{ 数据对象|过滤器名称:参数 }}
    过滤器最多只能额外传输一个参数

2.常见过滤器

1.统计数据的长度 length
    s1 = '葫芦娃 葫芦娃 一棵藤上七个娃'      
    s2 = 'run fast hit fast win fast'   
    
    {{ s1|length }}		# 15
    {{ s2|length }}		# 26
2.算数加法或字符串加法(不能字符串+数字) add
    s3 = 123
    s4 = 'abc'
    
    {{ s3|add:111 }},{{ s3|add:'aaa' }}	# 234,
    {{ s3|add:111 }},{{ s3|add:'aaa' }}	# ,abcaaa
3.将数字转成合适的文件计量单位 filesizeformat
    file_size1 = 99999
    file_size2 = 29999999
    
    {{ file_size1|filesizeformat }}	# 97.7 KB
    {{ file_size2|filesizeformat }}	# 28.6 MB
4.判断当前数据对象对应的布尔值是否为False,为False则使用默认值 default
    b1=True
    b2=False
    s1 = '葫芦娃 葫芦娃 一棵藤上七个娃'
    
    {{ b1|default:'布尔值为False' }}	# True
    {{ b2|default:'布尔值为False' }}	# 布尔值为False
    {{ s1|default:'布尔值为False' }}	# 葫芦娃 葫芦娃 一棵藤上七个娃
5.时间格式化 date
    from datetime import datetime
    ctime = datetime.today()
        
    {{ ctime }}			# May 16, 2022, 4:42 p.m.
    {{ ctime|date }}		# May 16, 2022
    {{ ctime|date:'Y-m-d' }}	# 2022-05-16
6.索引切片 slice
    s1 = '葫芦娃 葫芦娃 一棵藤上七个娃'
    {{ s1|slice:'0:7' }}	# 葫芦娃 葫芦娃
7.按照空格截取指定个数的文本 truncatewords
	'''
	截取个数 < 总个数  末尾...
        	≥ 总个数   末尾没...
'''
    s1 = '葫芦娃 葫芦娃 一棵藤上七个娃'      
    s2 = 'run fast hit fast win fast'
    
    {{ s1|truncatewords:2 }}	# 葫芦娃 葫芦娃 ...
    {{ s2|truncatewords:4 }}	# run fast hit fast ...
8.按照字符个数截取文本(包含... 占了三个字符) truncatechars
	'同上'
    s2 = 'run fast hit fast win fast'
    
    {{ s2|truncatechars:20 }}	# run fast hit fast...
9.移除指定字符 cut
    s2 = 'run fast hit fast win fast'
    s5 = 'a|b|c|d|e|f|g'
    
    {{ s2|cut:' ' }}		# runfasthitfastwinfast
    {{ s5|cut:'|' }}		# abcdefg
10.是否取消转换
    tag1 = '<h1>一个一级标题</h1>'
    scripts1 = '<script>alert(123)</script>'
    
    <p>{{ tag1 }}</p>		# <h1>一个一级标题</h1>
    <p>{{ scripts1 }}</p>	# <script>alert(123)</script>

  # 方式一:前端转换 safe
    <p>{{ tag1|safe }}</p>
    <p>{{ scripts1|safe }}</p>
	
  # 方式二:后端转换
    from django.utils.safestring import mark_safe
    a1 = '<a href="https://www.baidu.com">点我</a>'
    res = mark_safe(a1)
    <p>{{ res }}</p>
    
    'ps':|safe启发了我们以后用django开发全栈项目前端页面代码(主要指HTML代码)也可以在后端编写

模板语法之标签

1.语法结构

{% 名字 ...%}
{% end名字 %}

2.if 判断

{% if 条件1 %}
    <p>你好啊</p>
{% elif 条件2 %}
    <p>hello</p>
{% else %}
    <p>萨瓦迪卡</p>
{% endif %}

3.for 循环

{% for i in list %}
    <p>{{ i }}</p>	
{% endfor %}

提供了forloop关键字	# 一个对象
{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}

{{ forloop.counter }}
{{ forloop.first }}

ps:针对字典同样提供了keys、values、items方法
{% for i in dict.keys %}    
{% for i in dict.values %}    
{% for i in dict.items %}    
# for+if其他使用
l1 = [111,222,333,444]
{% for i in l1 %}
    {% if forloop.first %}
        <p>第一个:{{ i }}</p>
    {% elif forloop.last %}
        <p>最后一个:{{ i }}</p>
    {% else %}
        <p>中间部分:{{ i }}</p>
    {% endif %}
{% endfor %}

'''
第一个:111
中间部分:222
中间部分:333
最后一个:444
'''
# empty for循环对象为空 自动执行
l2 = []
{% for i in l2 %}
    {% empty %}
        <p>for循环对象为空 自动执行</p>
{% endfor %}

'''
for循环对象为空 自动执行
'''

自定义过滤器、标签、inclusion_tag

"""
1.在应用下需要创建一个名为templatetags的文件夹
2.在该文件夹内创建一个任意名称的py文件
3.在该py文件内需要先提前编写两行固定的代码
	from django import template
	register = template.Library()
"""

1.自定义过滤器

# 自定义过滤器:只能接收两个参数
@register.filter(is_safe=True)
def index(a, b):
    return a + b

{% load mytag %}
{{ s3|index:100 }}	# 223

2.自定义简单标签

# 自定义简单标签:可以接收任意的参数
@register.simple_tag(name='my_tag')
def func1(a, b, c, d):
    return a + b + c + d

{% my_tag 1 2 3 4 %}  # 参数之间空格隔开即可

3.自定义inclusion_tag

@register.inclusion_tag('left.html')
def func2(n):
    l1 = []
    for i in range(1, n + 1):
        l1.append(f'第{i}页')
    return locals()

###left.html###
<ul>
    {% for foo in l1 %}
        <li>{{ foo }}</li>
    {% endfor %}
</ul>

{% func2 5 %}

'''该方法需要先作用于一个局部html页面 之后将渲染的结果放到调用的位置'''

模板导入(了解)

类似于将html页面上的局部页面做成模块的形式 哪个地方想要直接导入即可展示

eg:有一个非常好看的获取用户数据的页面 需要在网站的多个页面上使用
    策略1:拷贝多份即可
    策略2:模板的导入
   
使用方式
	{% include 'menu.html' %}

注释语法补充

<!---->  	  是HTML的注释语法
{##}		 是django模板语法的注释
"""
HTML的注释可以在前端浏览器页面上直接查看到
模板语法的注释只能在后端查看 前端浏览器查看不了
"""

模板的继承

类似于面向对象的继承:继承了某个页面就可以使用该页面上所有的资源
  
有很多网站的很多页面 其实都是差不多的 只是局部有所变化 模板的继承可以很好的实现该需求

1.先在模板中通过block划定将来可以被修改的区域
	{% block content %}
  	<h1>主页内容</h1>
  	{% endblock %}
    
2.子板继承模板
	{% extends 'home.html' %}
    
3.修改划定的区域
	{% block content %}
            <h1>登录内容</h1>
	{% endblock %}   
    
4.子页面还可以重复使用父页面的内容
	{{ block.super }}
"""
模板上最少应该有三个区域
	css区域、内容区域、js区域
子页面就可以有自己独立的css、js、内容
"""    

前期数据准备

"""
django自带的sqlite3数据库 功能很少 并且针对日期类型不精确

1.数据库正向迁移命令(将类操作映射到表中)
    python3 manage.py makemigrations
    python3 manage.py migrate
2.数据库反向迁移命令(将表映射成类)
    python3 manage.py inspectdb
"""

需求
	我们只想操作orm 不想使用网络请求
  	需要有专门的测试环境
    1.自己搭建
    	import os
	if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day54.settings")
    	import django
    	django.setup()

    2.pycharm提供
    	python console

orm操作关键字

1.all()
res = models.User.objects.all()
# 查询所有的数据
# QuerySet  可以看成是列表套对象
2.filter()
res = models.User.objects.filter()
# 括号内填写筛选条件  不写相当于all()
# QuerySet  可以看成是列表套对象

res = models.User.objects.filter(pk=1)
# 想通过主键筛选数据 可写pk 会自动定位到当前表的主键字段

res = models.User.objects.filter(pk=1)[0] 
# 直接获取数据对象               
# QuerySet支持索引取值 但是django不推荐使用 因为索引不存在会直接报错

res = models.User.objects.filter(pk=1).first()  
# 获取结果集中第一个对象     推荐使用封装的方法 
# 不会出现索引超出范围报错的情况
  
res = models.User.objects.filter(pk=1, name='kevin').first()  
# 括号内支持填写多个筛选条件 默认是and关系

res = models.User.objects.filter().filter().filter().filter().filter()  
# 只要是QuerySet对象就可以继续点对象方法(类似于jQuery链式操作)
    
res = models.User.objects.filter().last() 
# 获取结果集中最后一个对象
3.distinct()
res = models.User.objects.all().distinct() 
# 数据对象中如果包含主键 不可能去重

res = models.User.objects.values('name').distinct()
4.order_by()
res = models.User.objects.order_by('age') 
# 默认是升序

res = models.User.objects.order_by('-age')  
# 字段前加 - 成降序

res = models.User.objects.order_by('age', 'pk')  
# 也支持多个字段依次排序
*5.exclude()	
res = models.User.objects.exclude(name='cc')  
# 取反操作 即拿不是cc的name
*6.reverse()  反转
res = models.User.objects.reverse() 
# 不起作用

res1 = models.User.objects.order_by('age').reverse()  
# 只有在order_by排序之后才可以
7.count()
res = models.User.objects.count()  
# 统计结果集的个数
*8.exists()
res = models.User.objects.exists()
res = models.User.objects.filter(name='csb').exists()  
# 判断结果集中是否有数据 有返回True 没有返回False
'''
filter()的结果本身自带布尔值 
'''
*9.get()
res = models.User.objects.get(pk=1) 
# 直接获取数据对象 但是不推荐使用

res = models.User.objects.get(pk=100) # 条件不存在 直接报错
res = models.User.objects.filter(pk=100)  
# 条件不存在 返回空None
'''
推荐filter() 不推荐get()
'''

标签:objects,models,res,day05,Django,filter,orm,User,葫芦娃
来源: https://www.cnblogs.com/run-fast-hit-fast-win-fast/p/16278855.html