模板层之标签
| {% if 条件1(可以自己写也可以用传递过来的数据) %} |
| <p>今天又是周三了</p> |
| {% elif 条件2(可以自己写也可以用传递过来的数据) %} |
| <p>百日冲刺<p> |
| {% else %} |
| <p>没多少时间了!来不及焦虑了好好学习!!</p> |
| {% endif %} |
| |
| |
| {% for k in t1 %} |
| {% if forloop.first %} |
| <p>这是我的第一次循环{{ k }}</p> |
| {% elif forloop.last %} |
| <p>这是我的最后一次循环{{ k }}</p> |
| {% else %} |
| <p>这是中间循环</p> |
| {% endif %} |
| |
| {% empty %} |
| <p>你给我传的数据是空的无法循环取值(空字符串、空列表、空子典)</p> |
| {% endfor %} |
| |
| django模板语法取值操作>>>:只支持句点符 |
| 句点符既可以点索引也可以点键 |
| {{ d1.hobby.2.a1}} |
| |
| {% 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> |
| |
| |
| |
| @register.simple_tag(name='mytag') |
| def func2(a, b, c, d, e): |
| return f '{a}-{b}-{c}-{d}-{e}' |
| {% load mytags %} |
| {% mytag 'jason' 'kevin' 'oscar' 'tony' 'lili'%} |
| |
| |
| |
| @register.inclustion_tag('menu.html',name='mymenu') |
| def func3(n): |
| html = [] |
| for i in range(n): |
| html.append('<li>第%s页<li>'%i) |
| return locals() |
| {% load mytags %} |
| {% mymenu 20 %} |
模板的继承与导入
| 模板的继承(重要) |
| 多个页面有很多相似的地方 我们可以采取下列方式 |
| 方式1: 传统的复制黏贴 |
| 方式2: 模板的继承 |
| 1.在模板中使用block划定子板以后可以修改的区域 |
| {% block 区域名称 %} |
| {% endblock %} |
| 2.子板继承模板 |
| {% extends 'home.html'%} |
| {% block 区域名称 %} |
| 子板自己的内容 |
| {% endblock %} |
| ps:模板中至少应该有三个区域 |
| 页面内容区、css样式区 、js代码区 |
| 补充: 子板也可以继续使用模板的内容 |
| {{ block.super }} |
| |
| |
| 模板的导入(了解) |
| 将某个html的部分提前写好 之后很多html页面都想使用就可以导入 |
| {% include 'myform.html' %} |
模板层之前期准备
| 1.自带的sqlite3数据库对时间字段不敏感 有时候会展示错乱 所以我们习惯切换成 常见的数据库比如MySQL django orm并不会自动帮你创建库 所以需要提前准备好 |
| |
| 2.单独测试django某个功能层 |
| 默认不允许单独测试某个py文件 如果想要测试某个py文件(主要models.py) |
| 测试环境1:pycharm提供的python console |
| 测试环境2:自己搭建(自带的test或者自己创建) |
| 1.拷贝manage.py前四行 |
| 2.自己再加两行 |
| import django |
| django.setup() |
| |
| 3.django orm底层还是SQL语句 我们是可以查看的 |
| 如果我们手上是一个QuerySet对象 那么可以直接点query查看SQL语句 |
| 如果想查看所有orm底层的SQL语句也可以再配置文件添加日志记录 |
ORM常用关键字
| 1.create() 创建数据并直接获取当前创建的数据对象 |
| res = models.User.objects.create(name='亚索',age = 28) |
| res = models.User.objects.create(name='盲僧',age = 18) |
| res = models.User.objects.create(name='劫',age = 58) |
| res = models.User.objects.create(name='瑞文',age = 18) |
| print(res) |
| |
| 2.filter() 根据条件筛选数据 如果是QuerySet [数据对象1,数据对象2] |
| res = models.User.objects.filter() |
| res = models.User.objects.filter(name='亚索') |
| res = models.User.objects.filter(name='亚索',age = 28) |
| |
| 3.first() last() |
| |
| res = models.User.objects.filter()[1] |
| res = models.User.objects.filter(pk=100)[0] |
| res = models.User.objects.filter(pk=100).first() |
| res = models.User.objects.filter().last() |
| |
| 4.update() 更新数据(批量更新) |
| models.User.objects.filter().update() |
| models.User.objects.filter(id=1).update() |
| |
| 5.delete() 删除数据(批量数据) |
| models.User.objects.filter().delete() |
| models.User.objects.filter(id=1).delete() |
| |
| 6.all() |
| |
| res = models.User.objects.all() |
| |
| 7.values() |
| |
| |
| res = models.User.objects.all().values('name') |
| res = models.User.objects.filter().values() |
| res = models.User.objects.values() |
| |
| 8.values_list() |
| |
| |
| res = models.User.objects.all().values_list('name','age') |
| |
| 9.distinct() |
| |
| res = models.User.objects.values('name','age').distinct() |
| |
| 10.order_by() 根据指定条件排序 默认是升序 字段前面加负号就是降序 |
| |
| res = models.User.objects.all().order_by('age') |
| print(res) |
| |
| 11.get() |
| |
| res = models.User.objects.get(pk=1) |
| print(res) |
| res = models.User.objects.exclude(pk=1) |
| print(res) |
| |
| 12.exclude() 取反操作 |
| res = models.User.objects.exclude(pk=1) |
| print(res) |
| |
| 13.reverse() 颠倒操作(被操作的对象必须是排过序的才可以) |
| res = models.User.object.all() |
| res = models.User.object.all().order_by('age') |
| res1 = models.User.object.all().order_by('age').reverse() |
| print(res,res1) |
| |
| |
| 14.count() 统计结果集中数据的个数 |
| res = models.User.objects.all().count() |
| print(res) |
| |
| 15.exist() 判断结果集中是否含有数据 如果有则返回True 没有则返回False |
| res = models.User.objects.all().exists() |
| print(res) |
| res1 = models.User.objects.filter(pk=100).exists() |
| print(res) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构