day54(过滤器)

今日内容概要

今日内容详细

模板语法之过滤器:他类似于内置函数

1.语法结构
	{{ 数据对象|过滤器名称:参数 }}  过滤器最多只能额外传输一个参数
2.常见过滤器(django模板语法提供了60+过滤器 我们了解几个即可)
首先看:
urls路由层代码:
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url('^index/',views.index)
]

vewis视图层代码:

def index(request):
    w1='hello zqh 周一又犯困了?'
    w2='床前明月 光疑是地上霜'
    w3=''#(空字符串)
    w4 = 666
    w5 = '床前 明月 光疑 是地 上霜 举头 望明 月低 头思 故乡'
    file_size = 8254
    big_file=999999999
    m=False
    from datetime import datetime
    time1 = datetime.today()
    info='zqh$666$green$'
    title = '<h1>标签标明吉博辕很大</h1>'
    scripts1 = '<scripts>吉博辕很大</scripts>'
    return render(request,'index1.html',locals())
html代码:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>{{ w1|length }}</p> 
<p>{{ w2|length }}</p>
<p>{{ w3|length }}</p>
<p>{{ w4|add:222 }}</p>
<p>{{ w3|add:'举头望明月' }}</p>
<p>{{ w1|add:'明日复明日明日何其多' }}</p>
<p>{{ file_size|filesizeformat }}</p>
<p>{{ big_file|filesizeformat }}</p>
<p>{{ w1|default:'w1前面的值对应的布尔值是False' }}</p>
<p>{{ m|default:'m前面的值对应的布尔值是False' }}</p>
<p>{{ time1 }}</p>
<p>{{ time1|date:'Y-m-d' }}</p>
<p>{{ time1|date:'Y-m-d H:i:s' }}</p>
<p>{{w2|slice:'0:5'}}</p>
<p>{{w5|truncatewords:5}}</p>
<p>{{w5|truncatechars:5}}</p>
<p>{{info|cut:'$'}}</p>
<p>{{ title }}</p>
<p>{{ scripts1 }}</p>
<p>{{ title|safe }}</p>
<p>{{ scripts1|safe }}</p>
</body>
</html>

1<p>统计数据的长度:{{ s1|length }}</p>.#运行结果之后页面分别返回17和十还有零由此可见这个方法返回的是数据长度,没有的话返回零
2 <p>算术加法或者字符串加法:{{ w4|add:222 }}、{{ w3|add:'举头望明月' }}</p>
#结果分别是888和举头望明月因为w3是一个空字符串,有返回结果可知 此方法可知内部首先进行对如果都是数字直接进行加法运算出他们的和,如果都是字符串直接拼接在一起,也可以说是尾部追加从w1返回结果可知'hello zqh 周一又犯困了?明日复明日明日何其多'
3.将数字转成合适的文件计量单位:{{ file_size|filesizeformat }},{{ big_file|filesizeformat }}#由返回结果可知此方法用来给你计算出最为适合的文件大小,返回结果分别为:
'8.1 KB 和953.7 MB'
4.此方法稍微有点鸡肋,#可以从返回结果看出就是用来判断对应的值是否为False:
 1.:<p>{{ w1|default:'w1前面的值对应的布尔值是False' }}</p>
1.:<p>{{ m|default:'m前面的值对应的布尔值是False' }}</p>
结果1:hello zqh 周一又犯困了?
结果2:m前面的值对应的布尔值是False
5:<p>{{ time1|date:'Y-m-d' }}</p>我们一般常用的就是这个方法格式胡时间
<p>{{ time1 }}</p>  结果返回May 16, 2022, 5:51 p.m.
<p>{{ time1|date:'Y-m-d' }}</p>   结果返回2022-05-16
<p>{{ time1|date:'Y-m-d H:i:s' }}</p>  结果返回2022-05-16 17:51:23
6:<p>{{w2|slice:'0:5'}}</p>
就是简单的索引切片操作也比较好理解跟我们所学的索引是一样的结果并拿到了一句话'床前明月光'
7.按照空格截取指定个数的文本:{{ w5|truncatewords:5 }}(words是单词的意思)
床前 明月 光疑 是地 上霜 ...
8.<p>{{w5|truncatechars:5}}</p>
看着很像这两个方法这个方法的意思是按照字符个数截取文本(包含三个点):(chars是字符)
    结果为:床前...
9;移除指定的字符:{{ info|cut:'$' }}移除指定字符
结果为:'zqh666green'
10.   <p>是否取消转换:{{ title }}、{{ title|safe }}、{{ scripts1|safe }}、{{ res }}</p>,可以说是确定安全之后执行

最后一个|safe启发了我们以后用django开发全栈项目前端页面代码(主要指HTML代码)也可以在后端编写

模板语法之标签

在django模板语法中写标签的时候 只需要写关键字然后tab键就会自动补全
1.语法结构
	{% 名字 ...%}
  {% end名字 %}、

if标签

{% if %}会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。


urls路由层代码:
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url('^index/',views.index)
]

vewis视图层代码:
    
def index(request):
	number = 101
    return render(request,'index1.html',locals()) 
HTML代码:
{% if number > 102 or number < 0 %}
    <p>无效</p>
{% elif number > 80 and number < 100 %}
    <p>优秀</p>
{% else %}
    <p>凑活吧</p>
{% endif %}


2.if判断
	{% if 条件1 %}
    <p>你好啊</p>
  {% elif 条件2 %}
    <p>他好呀</p> 
    
  {% else %}
    <p>大家好</p>
  {% endif %}
3.for循环
{% for i in list1 %}
<p>{{ forloop }}</p>
{% endfor %}
结果为:
    {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}

{'parentloop': {}, 'counter0': 1, 'counter': 2, 'revcounter': 3, 'revcounter0': 2, 'first': False, 'last': False}

{'parentloop': {}, 'counter0': 2, 'counter': 3, 'revcounter': 2, 'revcounter0': 1, 'first': False, 'last': False}

{'parentloop': {}, 'counter0': 3, 'counter': 4, 'revcounter': 1, 'revcounter0': 0, 'first': False, 'last': True}

其中我们先看比较好理解的看first和last:first代表第一次循环 last代表最后一次循环
'counter0'代表从零计数
counter1'代表从一计数
revcounter:'表示从最后一条数据计数,数据有几条开始数为几'
revcounter0:'表示从最后一条数据计数从3开始,最后一条为零'
很熟悉他们两个像是升序降序
{% for i in list1 %}
<p>{{ i}}</p>
{% endfor %}
i代表列表中的结果

 for+if嵌套使用

    HTML代码:
  {% for i in list1 %}
    {% if forloop.first %}
        <p>这是第一次循环</p>
    {% elif forloop.last %}
        <p>这是最后一次循环</p>
    {% else %}
        <p>中间循环</p>
    {% endif %}
    {% emdpty %}
        <p>for循环对象为空 自动执行</p>
  {% endfor %}


HTML代码:同样支持点keys 点values
{% for foo in user_dict %}
{{ foo }}
{% endfor %}
{% for foo in user_dict.keys %}
{{ foo }}
{% endfor %}
{% for foo in user_dict.values %}
{{ foo }}
{% endfor %}
{% for foo in user_dict.items %}
{{ foo }}
{% endfor %}

ps:针对字典同样提供了keys、values、items方法

自定义过滤器、标签、inclusion_tag

-第一步:
	在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag
    
-第二步:
	在app中创建templatetags包(包名只能是templatetags,不能改)
    
-第三步:
	在包内,新建py文件(如:my_tags.py)
    在该py文件内需要先提前编写两行固定的代码
	from django import template
	register = template.Library()

-第四步:
	# 写代码(过滤器)
    from django import template
    register = template.Library()
    @register.filter
    def my_upper(value):
        return value.upper()
    
-第五步:
	#(模板),先load,再使用
    {% load my_tags %}
    {{ 'aa'|my_upper }}


-第一步:
	# 新建一个 xx.html,把好看的模板写入
    <div class="panel panel-danger">
        <div class="panel-heading">
            <h3 class="panel-title">重金求子</h3>
        </div>
        <div class="panel-body">
       		详情点击:<a href="http://www.baidu.com">疯狂点我</a>
        </div>
    </div>
    
-第二步:
	# 放在你想使用的地方
	{% include 'xx.html' %}

    
copy:"""
1.在应用下需要创建一个名为templatetags的文件夹
2.在该文件夹内创建一个任意名称的py文件
3.在该py文件内需要先提前编写两行固定的代码
	from django import template
	register = template.Library()
"""
# 自定义过滤器:只能接收两个参数
@register.filter(is_safe=True)
def index(a, b):
    return a + b
{% load mytag %}
{{ n1|index:666 }}

# 自定义简单标签:可以接收任意的参数
@register.simple_tag(name='my_tag')
def func1(a, b, c, d):
    return a + b + c + d
{% my_tag 1 2 3 4 %}  # 参数之间空格隔开即可

# 自定义inclusion_tag
@register.inclusion_tag('left.html')
def func2(n):
    l1 = []
    for i in range(1, n + 1):
        l1.append(f'第{i}页')
    return locals()
{% func2 10 %}
###left.html###
<ul>
    {% for foo in l1 %}
        <li>{{ foo }}</li>
    {% endfor %}
</ul>
'''该方法需要先作用于一个局部html页面 之后将渲染的结果放到调用的位置'''

my_tags.py代码:
    from django import template

register = template.Library()


@register.filter(is_safe=True, name='zqh')
def index1(a, b):
    return a + b
HTML代码:
{% load mytag %}
{{ n1|index:666 }}

@register.simple_tag(name='myTag')
def func1(a, b, c, d):
    return a + b + c + d
HTML代码:
{% load my_tags %}
{% myTag 1 3 4 5 %}

inclusion_tag 用法

# inclusion_tag作用: 
	可以生成一片模板中的代码块
    
# 使用方法
	-第一步:
    	在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag
        
    -第二步:
    	在app中创建templatetags包(包名只能是templatetags,不能改)
        
    -第三步:
    	在包内,新建py文件(如:my_tags.py)
        
    -第四步:
    	# 写代码(inclusion_tag)
        # inclusion_tag,传一个模板文件
        @register.inclusion_tag('left.html')
        def left(num):
            # dic={0:第0页,1:第1页,2:第2页} 字典推导式
            dic = {i: '第%s页' % i for i in range(num)}
            # 固定返回的必须是字典
            print(dic)
            return {'data': dic}

        @register.inclusion_tag('beautiful.html')
        def beautiful(title, url):
            return {'title': title, 'url': url}
        
    -第五步使用:
    	#(模板),先load,再使用
    	{% load my_tags %}
		{% left 5 %}
        {% beautiful '名字' '地址' %}   
        
# inclusion_tag与tag的区别
	-tag需要在代码中写html的东西
    -inclusion_tag代码跟模板分离

模板的导入(了解)

-第一步:
	# 新建一个 xx.html,把好看的模板写入
    <div class="panel panel-danger">
        <div class="panel-heading">
            <h3 class="panel-title">重金求子</h3>
        </div>
        <div class="panel-body">
       		详情点击:<a href="http://www.baidu.com">疯狂点我</a>
        </div>
    </div>
    
-第二步:
	# 放在你想使用的地方
	{% include 'xx.html' %}

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

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

3. 静态文件使用方式

# settings.py 文件中静态文件相关配置
STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),
]

# 静态文件三种使用方式
第一种: 
	<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
    
第二种:
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
    
第三种:
    {% load static %}
    <link rel="stylesheet" href="{% get_static_prefix %}bootstrap/css/bootstrap.min.css">

# 特殊用法
	{% load static %}
    {% static "images/hi.jpg" as myphoto %}
    <img src="{{ myphoto }}"></img>
    
    {% load static %}
	{% get_static_prefix as static %}
	<img src="{{ static }}images/hi.jpg" alt="Hi!"/>

前期数据准备

    register_time = models.DateField()
"""auto_now:每次修改数据的时候都会自动修改时间
auto_now_add:数据被创建出来的时候会自动记录当前时间,之后如果没有人为干涉保持不变"""


"""
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

all和filter方法

1.all()返回的是QuerySet对象(字典列表),程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使用for循环可以获取数据。

2.filter() 返回的是QuerySet对象(字典),与all()相似,只是all()是查询所有数据,常用:filter表示‘ = ’,exclude表示’ != ’。——.first()

3.get()返回的是Model对象,类型为列表,说明使用get方法会直接执行sql语句获取数据。

通过type(),查看它们的类型
通过get()查询,返回的结果为模型类对象,使用get方法会直接执行sql语句获取数据(不可迭代),而filter()以及all()返回的结果为查询集(QuerySet)对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使用for循环可以获取数据。



rs=Person.objects.all()
all返回的是QuerySet对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使用for循环可以获取数据。
 
rs=Person.objects.get(id=‘1‘)
get返回的是Model对象,类型为列表,说明使用get方法会直接执行sql语句获取数据
 
Person.objects.filter()
filter和get类似,但支持更强大的查询功能

ORM简单操作

models.User.objects.all(): 查询所有结果

models.User.objects. filter(**kwargs): 它包含了与所给筛选条件相匹配的对象

models.User.objects. get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。

models.User.objects.exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象

models.User.objects.values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列

models.User.objects.values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列

models.User.objects.order_by(*field): 对查询结果排序

models.User.objects.reverse(): 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)

models.User.objects. distinct(): 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重)

models.User.objects.count(): 返回数据库中匹配查询(QuerySet)的对象数量。

models.User.objects.first(): 返回第一条记录

models.User.objects.last(): 返回最后一条记录

models.User.objects.exists(): 如果QuerySet包含数据,就返回True,否则返回False
posted @   文质彬彬赵其辉  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示