模板层之标签

if判断

if、elif、else

{% if 条件1(可以自己写也可以用传递过来的数据) %}
<p>今天又是周三了</p>
{% elif 条件2(可以自己写也可以用传递过来的数据) %}
<p>百日冲刺</p>
{% else %}
<p>没多少时间了!</p>
{% endif %}

在view视图层中定义视图函数

注意{{ }}主要与数据值相关 {% %}主要与逻辑相关

在前端使用模板语法

for循环

普通for循环

for循环可以使用到的参数 自带关键字forloop

{% for i in l1 %}
<p>{{ forloop }}</p>
{% endfor %}

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

结果展示

django模板语法取值操作>>>:只支持句点符
句点符既可以点索引也可以点键
{{ d1.hobby.2.a1 }}

要展示haha

会自动区分是键还是索引 可以点索引也可以点键

当复杂数据获取之后需要反复使用可以起别名 但别名仅限于在with里面使用

{% with d1.hobby.2.a1 as h %}
<a href="">{{ h }}</a>
{% 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>

django过滤器最大只能接受两个参数

在py文件下自定义过滤器:



用之前需要加载过滤器:

自定义标签(参数没有限制)


# 参数 标签 标签名字
@register.simple_tag(name='mytag')
def func2(a,b,c,d,e):
return f'{a}-{b}-{c}-{d}-{e}'



自定义inclusion_tag(局部的html代码)

首先我们要事先在templatetags下的py文件定义好一个函数

# 自定义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()

menu.html:我们函数的返回值将会输入到这个html文件中。这个html不是完整的html,只包含一部分标签,可以理解成一个小组件。

name='mymenu':这是我们定义的inclusion_tag的名字,可以通过这个名字,调用函数func3。

menu.html内部代码:



menu.html接受到func3传来的列表

['<li>第1页</li>','<li>第2页</li>','<li>第3页</li>','<li>第4页</li>','<li>第5页</li>'....]

模板的继承与导入

模板的继承(重要)

什么是模板继承?

你需要事先在你想要使用的主页面上划定区域做好标记,之后在子页面继承的时候你就可以使用在主页面划定的区域,也就意味着,如果你不划定任何区域,那么你子页面将无法修改主页面内容

如何使用它的继承?

1.先在你想要继承的主页面上通过bolck划定你将来可能要改的区域,并做好标记
2.在子页面上继承extends,利用block自动提示选取你想要修改的内容区域标记名称
3.在子页面extends中写你要修改主页面标记区的代码
4.然后就可以让子页面的修改内容渲染到主页面的划定区域上 # 模板页面提前先写好将来可能要替换的内容
{% block 名字 %}
"""模板内容"""
{% endblock %}
# 新页面要基于模板页面替换的内容
{% extends 'html文件名' %}
{% block 名字 %}
"""子板内容"""
{% endblock %}
"""一般情况下母板中至少应该有三个区域使得扩展性更高!!! css content js"""
{% block css %}
<style>...</style>
{% endblock %} {% block content %}
...
{% endblock %} {% block js %}
<script>...</script>
{% endblock %}
'''子板中还可以使用母板的内容 {{ block.super }} '''



注意这里的content只是个名字,可以自行修改。

继承页可以修改content代码块的内容:

模板的导入(了解)

将页面的某一个局部当成模块的形式
哪个地方需要就可以直接导入使用即可 导入格式
{% include '导入html文件名' %}

模型层之前期准备

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

单独测试django某个功能层

默认不允许单独测试某个py文件 如果想要测试某个py文件可以有两种方式

方式一:

在任意空的py文件中准备环境

'''复制mange.py文件的前四行代码 放入一个空白的py文件中 但是不要放入已有的文件中'''
import os def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djang04.settings')
import django # 这个导入文件只能放在这里,放在外面会报错
django.setup() from app01 import models # 这个导入文件也只能放在这里,放在外面会报错
print(models.User.objects.filter()) if __name__ == '__main__':
main()



方式二:

pycharm提供测试环境

python console命令行测试环境

终端的形式 代码没法保存下来 电话关掉以后 代码就会没有了 只是临时的

ORM常用关键字

创建数据 返回值就是当前创建的数据对象,可以通过点的方式去获取数据对象里面具体的某个字段的值


1.当需要查询数据主键字段值的时候 可以使用pk忽略掉数据字段真正的名字
2.在模型类中可以定义一个__str__方法 便于后续数据对象被打印展示的是查看方便
3.Queryset中如果是列表套对象那么直接for循环和索引取值但是索引不支持负数
4.虽然queryset支持索引但是当queryset没有数据的时候索引会报错 推荐使用first
1.create()
创建数据 返回值就是当前创建的数据对象
ps:还可以利用类实例化对象然后调用save方法创建
2.update()
更新数据
3.delete()
删除数据 import os def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djang04.settings')
import django
django.setup() from app01 import models
print(models.User.objects.filter()) res = models.User.objects.create(name='kevin', age=38)
print(res)
user_obj = models.User(name='oscar', age=20)
user_obj.save()
# 对象可以通过点的方式取值
print(res.name)
print(res.age)
print(res.join_time)
# 获取主键
print(res.uid)
print(res.pk) if __name__ == '__main__':
main() 查找主键的时候有俩中方式:
1.我们可以通过主键名去使用点的方式去获取
2.也可以通过点pk得方式去获取
查找数据对象的主键以后我们创建表的时候可能会创建好多表,那么每个表中的主键名可能不一样,我们在要获取表对象的主键得时候,需要知道表的主键名,使用pk的话它会自动帮我们去找

filter()

筛选数据 返回值是一个QuerySet(可以看成是列表套数据对象)
1.括号内不写查询条件 默认就是查询所有
2.括号内可以填写条件 并且支持多个 逗号隔开 默认是and关系 res = models.User.objects.filter(name='kevin', age=38)
print(res) # <QuerySet [<User: 对象:kevin>]>

all()

查询所有数据 返回值是一个QuerySet(可以看成是列表套数据对象)

    res = models.User.objects.all()
print(res) # <QuerySet [<User: 对象:jason>, <User: 对象:kevin>, <User: 对象:tony>]>

first()

获取Queryset中第一个数据对象 如果为空则返回None

    res = models.User.objects.all().first()
print(res) # 对象:jason

last()

获取Queryset中最后一个数据对象 如果为空则返回None

    res = models.User.objects.all().last()
print(res) # 对象:tony

get()

直接根据条件查询具体的数据对象 但是条件不存在直接报错 不推荐使用

    res = models.User.objects.get(pk=2)
print(res) # 对象:kevin
这个方法与filter方法对比:
res = models.User.objects.get(pk=2)
print(res) # 对象:kevin
res = models.User.objects.filter(pk=2).first()
print(res) # 对象:kevin
虽然看起来get方法可能更简单一点,但是不推荐使用get方法
当查询查询条件不存在的时候:
res = models.User.objects.get(pk=21)
print(res) # 直接报错
res = models.User.objects.filter(pk=21).first()
print(res) # None

values()

指定查询字段 结果是Queryset(可以看成是列表套字典数据)

    res = models.User.objects.values()
print(res) # <QuerySet [{'uid': 1, 'name': 'jason', 'age': 18, 'join_time': datetime.date(2022, 9, 5)}, {'uid': 2, 'name': 'kevin', 'age': 38, 'join_time': datetime.date(2022, 9, 5)}, {'uid': 3, 'name': 'tony', 'age': 19, 'join_time': datetime.date(2022, 9, 5)}]>

value_list()

指定查询字段 结果是Queryset(可以看成是列表套元组数据)

order_by()

指定字段排序 默认是升序 在字段前加负号则为降序 并且支持多个字段排序

    res = models.User.objects.order_by('age')
print(res) # <QuerySet [<User: 对象:jason>, <User: 对象:tony>, <User: 对象:kevin>]>
res = models.User.objects.order_by('-age')
print(res) # <QuerySet [<User: 对象:kevin>, <User: 对象:tony>, <User: 对象:jason>]>

count()

统计orm查询之后结果集中得数据格式

    res = models.User.objects.all().count()
print(res) # 3

distinct()

针对重复的数据进行去重 一定要注意数据对象中的主键

exclude()

针对括号内的条件取反进行数据查询QuerySet(可以看成是列表套数据对象)

    res = models.User.objects.exclude(pk=2)
print(res) # <QuerySet [<User: 对象:jason>, <User: 对象:tony>]>

reveres()

针对已经排了序的结果做颠倒

exists()

判断查询结果集是否有数据 返回布尔值 但是几乎不用因为所有数据自带布尔值

模板层之标签 自定义过滤器及标签 模板的继承与导入 模型层之前期准备 ORM常用关键字的更多相关文章

  1. Web框架之Django_04 模板层了解(过滤器、标签、自定义过滤器、标签、inclusion_tag、模板的继承与导入)

    摘要: 模版层(模板语法) 模板语法 过滤器 标签 自定义过滤器.标签 inclusion_tag 模板的继承 模板的导入 一.模板语法: 常用语法:{{     }}    变量相关{% %}    ...

  2. Django框架(七)—— 模板层:变量、过滤器、标签、自定义标签和过滤器

    目录 模板层:变量.过滤器.标签.自定义标签和过滤器 一.模板层变量 1.语法 2.使用 二.模板层之过滤器 1.语法 2.常用过滤器 3.其他过滤器 三.模板值标签 1.for标签 2.if标签 3 ...

  3. Django学习——Django settings 源码、模板语法之传值、模板语法之获取值、模板语法之过滤器、模板语法之标签、自定义过滤器、标签、inclusion_tag、模板的导入、模板的继承

    Django settings 源码 """ 1.django其实有两个配置文件 一个是暴露给用户可以自定义的配置文件 项目根目录下的settings.py 一个是项目默 ...

  4. 一、变量.二、过滤器(filter).三、标签(tag).四、条件分支tag.五、迭代器tag.六、自定义过滤器与标签.七、全系统过滤器(了解)

    一.变量 ''' 1.视图函数可以通过两种方式将变量传递给模板页面 -- render(request, 'test_page.html', {'变量key1': '变量值1', ..., '变量ke ...

  5. django自定义过滤器和标签

    1.自定义过滤器和标签的流程: 1.在某个app下创建一个名为templatetags(必需,且包名不可变)的包.假设我们在名为app01的app下创建了一个templatetags的包,并在该包下创 ...

  6. Django——5 自定义过滤器及标签

    Django 自定义过滤器 自定义标签 简单标签 包含标签 自定义过滤器 自定义过滤器就是一个带有一个或两个参数的Python 函数: - (输入的)变量的值 —— 不一定是字符串形式. - 参数的值 ...

  7. Django入门--自定义过滤器与标签

    ---恢复内容开始--- 为了让Django找到自定义的模板过滤器和模板标签,需要进行文件路径配置,配置方式分为APP目录下配置和项目路径下配置两种方式: 1.在APP目录下配置:针对某个应用特定的自 ...

  8. 自定义过滤器和标签 & 静态文件相关

    自定义过滤器和标签 1.在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. 2.在app中创建templatetags模块(模块名 ...

  9. 小白学习django第三站-自定义过滤器及标签

    要使用自定义过滤器和标签,首先要设置好目录结构 现在项目目录下建立common的python包 再将common加入到setting.py中的INSTALLED_APP列表中 在common创建目录t ...

  10. Django框架(六)--模板层:变量、过滤器、标签、自定义标签和过滤器

    将页面的设计和Python的代码分离开会更干净简洁更容易维护. 我们可以使用 Django的 模板系统 (Template System)来实现这种模式 # django模板修改的视图函数 def c ...

随机推荐

  1. mongodb停止关闭服务

    停止服务的方式有两种:快速关闭和标准关闭,下面依次说明: (一)快速关闭方法(快速,简单,数据可能会出错) 目标:通过系统的kill命令直接杀死进程: 杀完要检查一下,避免有的没有杀掉. #通过进程编 ...

  2. PAT (Basic Level) Practice 1012 数字分类 分数 20

    给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A1​ = 能被 5 整除的数字中所有偶数的和: A2​ = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1​−n ...

  3. 几个Caller-特性的妙用

    System.Runtime.CompilerServices命名空间下有4个以"Caller"为前缀命名的Attribute,我们可以将它标注到方法参数上自动获取当前调用上下文的 ...

  4. ifram父页面、子页面元素及方法的获取调用

    page1 父页面 <div id="ifram" class="parent1"> <iframe frameborder="0& ...

  5. Maximum Entropy Population-Based Training for Zero-Shot Human-AI Coordination

    原文:https://www.cnblogs.com/Twobox/p/16791412.html 熵 熵:表述一个概率分布的不确定性.例如一个不倒翁和一个魔方抛到地上,看他们平稳后状态.很明显,魔方 ...

  6. 【算法训练营day7】LeetCode454. 四数相加II LeetCode383. 赎金信 LeetCode15. 三数之和 LeetCode18. 四数之和

    [算法训练营day7]LeetCode454. 四数相加II LeetCode383. 赎金信 LeetCode15. 三数之和 LeetCode18. 四数之和 LeetCode454. 四数相加I ...

  7. Selenium+Python系列(二) - 元素定位那些事

    一.写在前面 今天一实习生小孩问我,说哥你自动化学了多久才会的,咋学的? 自学三个月吧,真的是硬磕呀,当时没人给讲! 其实,学什么都一样,真的就是你想改变的决心有多强罢了. 二.元素定位 这部分内容可 ...

  8. Vue学习之--------脚手架的分析、Ref属性、Props配置(2022/7/28)

    欢迎大家加入我的社区:http://t.csdn.cn/Q52km 社区中不定时发红包 文章目录 1.脚手架的分析 2.ref属性 2.1 基础知识 2.2 代码实现 2.3 测试效果 3.Props ...

  9. etcd定时任务脚本执行失败

    etcd定时任务脚本执行失败 报错如下:etcdctl命令不存在 是因为在脚本中etcdctl命令没有写绝对路径,修改标记部分改成绝对路径 可以先获取路径然后改成绝对路径问题解决 which etcd ...

  10. Nginx四层负载均衡1

    1.Nginx负载均衡Redis 服务器 IP地址 作用 系统版本 Nginx代理服务器 10.0.0.38 负载均衡服务器 Rocky8.6 Redis服务器1 10.0.0.18 Redis服务器 ...