ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-05-16 22:32:54  阅读:194  来源: 互联网

标签:objects models res day05 Django filter orm User 葫芦娃


目录

模板语法之过滤器

类似于内置函数

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有