模板层和模型层基础操作


目录
    • 模板语法之过滤器
    • 模板语法之标签
    • 自定义功能
      • 自定义过滤器
      • 自定义简单标签
      • 自定义inclusion_tag
    • 模板的导入
      • 注释语法补充
      • 模板的继承
  • 模型层
    • 前期数据准备
    • all()和filter()方法
      • all()方法
      • filter方法
    • ORM常见的关键字操作

模板语法之过滤器

功能类似与内置函数
1. 语法结构 
	{{数据对象|过滤器名称:参数}} 
    过滤器最多额外传一个参数
2. 常见的过滤器
	

统计数据长度{{ s1|length }}

length的底层源代码显示如果在length函数收到的value值为error 传达的值不会报错 函数里面返回的值套在里主动报错的函数里面 会返回一个0 * {{ s1|length }} 是用于统计长度 * p>算术加法或者字符串加法:{{ s1|add:111 }}、{{ s1|add:'字节数' }}

注意 s1是被底层函数的arg接收的 底层会将我们的数值转换int 同样不会报错 接收到的值为error的情况下会主动的报一个 ''空值 *

将数字转成合适的文件计量单位:{{ file_size|filesizeformat }}、{{ file_size1|filesizeformat }}

filesizefromat 更像一个结合 在传值为0 的情况下 返回的值是0KB 底层做了数学判断 KB = 1 << 10 MB = 1 << 20 GB = 1 << 30 TB = 1 << 40 PB = 1 << 50 下载文件的提示大小便是用此方法打印出 * 已知 s1poor值为Flase 在前端进行接收

{{ s1poor|default:"对应的布尔值是什么" }}

default 用于判断接收的boor值是什么 上方的这个POOR是手贱打出请过滤 * 时间导入模块

{{ ctime }} 直接获取的值是纯英文时间 需要进行转译 方法如下

{{ ctime|date:'Y-m-d' }}

获取的纯中文格式的时间

{{ ctime|date:'Y-m-d H:i:s' }}

后加的时间和我们平常的时分秒不同用的是H:i: * 切片操作 该函数添加在主动报错的情况下 后续的报错返回值是一个None 成功则添加到arg循接收的参数

{{ s1|slice:'切片的起始位置:切片的终止位置' }}

* 按照空格截取指定个数的文本

{{ s2|truncatewords:截取的段数 }}

多出的字节将会以...的形式接在末尾 以博客园和天涯论坛的结束为例 * 按照字符个数进行截取文本连空格

{{ s2|truncatechars:9 }}

注意:截取后的三个点也算字符数 底层的Truncator(value).chars(length) 接收的长度进行逻辑判断 * 移除指定字符

{{ s3|cut:'指定的字符' }}

对指定的字符进行切割 类似于PYTHON中的spilt 底层会将我们指定的字符进行逻辑判断 然后remove * join 方法

{{ s1|join:添加的字符 }}

{{ htlm }}

后端编写的内容答打印到前端 需要对后端的代码进行操作

{{ htlm }}、{{ htlm|safe }}

safe 字节封装表示后端的代码安全可以封装 baidu = '百度' res = mark_safe(ttt) 该res表示后端的网页跳转是安全的 {{ scripts1|safe }}、{{ res }}

js渲染需要注意执行弹窗 如果不进行打断无限执行会导致程序执行崩溃xcc脚本攻击就是这个原理 ps:最后一个|safe启发了我们以后用django开发全栈项目前端页面代码(主要指HTML代码)也可以在后端编写

模板语法之标签

"""
在django模板语法中写标签的时候 只需要写关键字然后tab键就会自动补全
"""
模板语法与逻辑相关 大多是用{% %}进行判断
1. 语法结构
  {% 名字 ...%}
  {% end名字 %}
2. if判断
{% if 判断条件一 %}
    

产生都结果

{% elif 判断条件二 %}

条件二的产生结果

{% else %}

所有条件都不满足的情况

{% endif %} # 终止条件 3. for循环 提供了forloop关键字 {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 8, 'revcounter0': 7, 'first': True, 'last': False} counter0:0 表示从0开始计数 counter:1 表示计数为1 first:表示是否是初次开始计数 last:表示是否是最后的计数 也可以直接在前端用后端的方法进行FOR循环 {% for i in l1 %}

{{ i }}

{% endfor %} 可以和逻辑判断进行结合使用 {% for i in l1 %} {% if forloop.first %}

初次循环

{% elif forloop.last %}

最后的循环

{% else %}

取值的为中间

{% endif %} {% endfor %} 补充: {% empty %}

for循环为空的时候使用

for 循环可以配合字典使用 {% for foo in user_info %} {{ foo }} {% endfor %} 在不行任何形式的取值情况下默认返回的是字典的KEY {% for foo in user_info.keys %} {{ foo }} {% endfor %} {% for foo in user_info.values %} {{ foo }} {% endfor %} {% for foo in user_info.items %} {{ foo }} {% endfor %}

自定义功能

自定义过滤器

"""
1.在应用下需要创建一个名为templatetags的文件夹(app01文件)
2.在该文件夹内创建一个任意名称的py文件
3.在该py文件内需要先提前编写两行固定的代码
	from django import template
	register = template.Library()
"""
# 过滤器最多额外传输一个参数
@register.filter(is_safe=True,name='重新指定的过滤器名字')
def res1(a,b):
    return a + b
但是还是无法在前端页面使用 需要和导入STATIC文件夹里面的CSS文件一样
需要事先的进行加载
{% load funcion %}
{{ a1|res1:666 }}
a1 = 100
res1是我们自己写的过滤器
{{ 单位元素|自定义的过滤器:条件}}

自定义简单标签

上述过滤器不支持多个参数进行运算 多个运算需要重新编写过滤器
在原有过滤器的基础上编写一个过滤器
过滤器的底层是以
@register. 的格式调用
@register.simple_tag(name='res1')调用我们编写的过滤器
def func1(a,b,c,d):
    return a+b+c+d
ps:在前端书写的情况时 需要导入的格式需要空格隔开
    {% res1 1 2 3 4 5 6 7 8 %}
自定义的标签是可以接收任意参数

自定义inclusion_tag

inclusion_tag和其他两个不一样 
自定义过滤器是先加载 {% load 过滤器名称 %} 然后调用函数
inclusion_tag在加载其模块的时候 会将其作用于页面上
然后将页面结果返回给函数调用位置
在
@register.inclusion_tag('life.html')
def func2(x):
    msg = []
    for i in range(1,x+1):
        msg.append(f'第{i}页')
    return locals()
{% load funcion %}
{% func2 10 %} # 这个10 是分10页的意思 
也就是将局部网页导入整体网页 用到的情况较少
'''该方法需要先作用于一个局部html页面 之后将渲染的结果放到调用的位置'''

模板的导入

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

eg:有一个非常好看的获取用户数据的页面 需要在网站的多个页面上使用
  	策略1:拷贝多份即可  多次cv即可
    策略2:模板的导入和继承
   
使用方式
局部页面
	{% include 'menu.html' %}
完整页面的导入
不推荐使用多个页面的混合使用导致 页面的BODY属性开始混乱
head和title会乱
不推荐完整页面导入

注释语法补充

在前端的展示的时候 会出现两个注释
正常界面是不会有Django语法注释 但是网页的局部导入会使其展示
  是HTML的注释语法
{##}		 是django模板语法的注释
    
"""
HTML的注释可以在前端浏览器页面上直接查看到
模板语法的注释只能在后端查看 前端浏览器查看不了
"""

模板的继承

* 和面向对象的父类继承是一样的 子页面可以继承父页面的全部内容 我称之为卡卡西行为 有很多网站的很多页面 其实都是差不多的 只是局部有所变化 模板的继承可以很好的实现该需求

* bootstrap网址上有很多

在前端添加完需求后 可以对计算机进行需求 Django支持网页按钮跳转功能	
需要在视图层和路由层添加相关函数

* 最简单的使用 
在模拟中划定修改的区域 block
	{% block content %}
  	

主页内容

{% endblock %} 2.子板继承模板 {% extends 'home.html' %} 3.修改划定的区域 {% block content %}

登录内容

{% endblock %} 4.子页面还可以重复使用父页面的内容 {{ block.super }} """ 模板上最少应该有三个区域 css区域、内容区域、js区域 子页面就可以有自己独立的css、js、内容 """

模型层

前期数据准备

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

1.数据库正向迁移命令(将类操作映射到表中)
	python3 manage.py makemigrations
  python3 manage.py migrate
2.数据库反向迁移命令(将表映射成类)
	python3 manage.py inspectdb
"""
在建立数据库后 我们要在视图层相关的视图函数导入moldes
然后在和模型层的视图函数做链接
如果不和前端进行交互便操作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()方法

all()方法

models.nameid23.objects.all()得出的结果是列表套对象
    
all()查询所有的列表对象

filter方法

models.nameid23.objects.filter()
后面不加任何条件进行判断的话返回的将会和ALL()一样
可以利用面向对象的自动打印字符串格式
在类后面加上
def __str__(self):
    return '对象:%s' % self.name
将返回的对象打印 该代码是自己添加 和数据库无关
res=models.nameid23.objects.filter(pk=1)
主键筛选数据是PK 会自动定位当前表的主键字段 无需自己查看字段名称
res=models.nameid23.objects.filter(pk=1)[0]为列表套对象的对象数据 queryset支持索引取值
res=models.nameid23.objects.filter(pk=1).first() 也可以使用自带的方法
res=models.nameid23.objects.filter(pk=1,name='jason').first()支持传多个参数 并且默认是and关系

ORM常见的关键字操作

res=models.nameid23.objects.all().values('name') # 可以看成列表套字典
也可以直接对主键操作
res=models.nameid23.objects.all().values('pk')
res=models.nameid23.objects.filter(pk=2).values('name') # 对字段做截取
res=models.nameid23.objects.all().values_list('name','age') # 看成是列表套元组
res=models.nameid23.objects.all().distict() # 数据对象中包含主键 则不能去重
res=models.nameid23.objects.order_by('排序的字段') # 按照字段从小到大的升序 默认是升序 
res=models.nameid23.objects.order_by('-排序的字段') # 降序排列
* 也支持多个字段依次排序
res=models.nameid23.objects.order_by('排序的字段1,排序字段2')
res=models.nameid23.objects.exculde(name='jason') # 取反操作
reverse()
该功能需要配合order_by排序后才能操作
count 用于计数
res=models.nameid23.objects.count()
用于对结果集的个数统计
最没用的一个 用于返回布尔值 boor
res=models.nameid23.objects.exists()

相关