模板层之标签

  1. {% if 条件1(可以自己写也可以是用传递过来的数据) %}
  2. <p>周三了 周三了</p>
  3. {% elif 条件2(可以自己写也可以用传递过来的数据) %}
  4. <p>百日冲刺</p>
  5. {% else %}
  6. <p>快要放假了</p>
  7. {% endif %}
  8. {% for k in t1 %}
  9. {% if forloop.first %}
  10. <p>这是我的第一次循环{{ k }}</p>
  11. {% elif forloop.last %}
  12. <p>这是我最后一次循环{{ k }}</p>
  13. {% else %}
  14. <p>这是中间循环{{ k }}</p>
  15. {% endif %}
  16. {% empty %}
  17. <p>你给我传的数据是空的无法循环取值(空字符串、空列表、空字典)</p>
  18. {% endfor %}
  19. django模板语法取值操作>>>:只支持距句点符
  20. 句点符既可以点索引也可以点键
  21. {{d1.hobby.2.a1}}
  22. <p>
  23. {% with d1.hobby.2.a1 as h %} 复杂数据获取之后需要反复使用可以起别名
  24. <a href="">{{ h }}</a>
  25. {% endwith %} </p>

forloop

自定义过滤器、标签及、inclusion_tag(了解)

  1. """
  2. 如果想要自定义一些模板语法 需要先完成下列的三步走战略
  3. 1.在应用下创建一个名字必须叫templatetags的目录
  4. 2.在上述目录下创建任意名称的py文件
  5. 3.在上述py文件内先编写两行固定的代码
  6. from django import template
  7. register = template.Library()
  8. """
  9. # 自定义过滤器(最大只能接收两个参数)
  10. @register.filter(name='myadd')
  11. def func1(a, b):
  12. return a + b
  13. {% load mytags %}
  14. <p>{{ a|myadd:1 }}</p>

这是定义过滤器过程中的一个报错







  1. # 自定义标签(参数没有限制)
  2. @register.simple_tag(name='mytag')
  3. def func2(a,b,c,d,e):
  4. return f'{a}-{b}-{c}-{d}-{e}'
  5. {% load mytags %}
  6. {% mytag 'jason' 'kevin' 'oscar' 'tony' 'lili' %}
  7. # 自定义inclusion_tag(局部的html代码)
  8. @register.inclusion_tag('menu.html',name='mymenu')
  9. def func3(n):
  10. html = []
  11. for i in range(n):
  12. html.append('<li>第%s页</li>'% i)
  13. return locals()
  14. menu.html局部页面代码
  15. <ul>
  16. {% for liStr in html %}
  17. {{ liStr|safe }}
  18. {% endfor %}
  19. </ul>
  20. {% load mytags %}
  21. {% mymenu 10 %}

模板的继承与导入

  1. 模板的继承(重要)
  2. 多个页面有很多相似的地方 我们可以采取下列方式
  3. 方式1:传统的复制粘贴
  4. 方式2:模板的继承
  5. 1.在模板中使用block划定字板以后可以修改的区域
  6. {% block 区域名称 %}
  7. {% endblock %}
  8. 2.子板继承模板
  9. {% extends 'home.html' %}
  10. {% block 区域名称 %}
  11. 子板自己的内容
  12. {% endblock %}
  13. ps:模板中至少应该有三个区域
  14. 页面内容区、css样式区、js代码区
  15. 补充:子板也可以继续使用模板的内容
  16. {{ block.super}}
  17. 模板的导入(了解)
  18. 将某个html的部分提前写好 之后很多html页面都想使用就可以导入
  19. {% include 'myform.html' %}

模型层之前期准备

  1. 1.自带的sqlite3数据库对日期字段不敏感 有时候会展示错乱所以我们习惯切换成常见的数据库比如MySQL django orm并不会自动帮你创建库 所以需要提前准备好
  2. 2.单独测试django某个功能层
  3. 默认不允许单独测试某个py文件 如果想要测试某个py文件(主要models.py)
  4. 测试环境1:pycharm提供的python console
  5. 测试环境2:自己搭建(自带的test或者自己创建)
  6. 1.拷贝manage.py前四行
  7. 2.自己再加两行
  8. import django
  9. django.setup()
  10. 3.django orm底层还是SQL语句 我们是可以查看的
  11. 如果我们手上是一个QuerySet对象 那么可以直接点query查看SQL语句
  12. 如果想查看所有orm底层的SQL语句也可以在配置文件添加日志记录
  1. 搭建测试环境时需要配合数据库进行,在进行数据库迁移命令操作时,我把django自带的makemigrations文件夹删除了然后只要执行makemigrations报错

  1. 执行migrate报错



# 不要删除django自带的文件夹!!!!!

ORM常用关键字

  1. models.py 代码
  2. from django.db import models
  3. # Create your models here.
  4. class User(models.Model):
  5. name = models.CharField(max_length=32, verbose_name='用户名')
  6. age = models.IntegerField(verbose_name='年龄')
  7. register_time = models.DateTimeField(verbose_name='注册时间', auto_now_add=True)
  8. '''
  9. 针对时间字段有两个重要的参数
  10. auto_now : 每次操作数据都会自动更新当前时间
  11. auto_now_add:创建数据自动获取当前时间 后续修改不人为操作的情况下不会更新
  12. '''
  13. def __str__(self):
  14. return f'用户对象{self.name}'
  15. tests.py代码
  16. import os
  17. def main():
  18. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoday05.settings')
  19. import django
  20. django.setup()
  21. from app01 import models
  22. # print(models.User.objects.filter())
  23. # 1.create() 创建数据并直接获取当前创建的数据对象
  24. # res = models.User.objects.create(name='tony', age=21)
  25. # res = models.User.objects.create(name='kevin', age=19)
  26. # res = models.User.objects.create(name='kkkk', age=22)
  27. # res = models.User.objects.create(name='llll', age=25)
  28. # res = models.User.objects.create(name='mmmm', age=17)
  29. # print(res)
  30. # 2.filter() 根据条件筛选数据 <QuerySet [<User: 用户对象jsaon>, <User: 用户对象tony>, <User: 用户对象kevin>, <User: 用户对象kkkk>, <User: 用户对象llll>, <User: 用户对象mmmm>]>
  31. # res = models.User.objects.filter()
  32. # res = models.User.objects.filter(name='jsaon') # <QuerySet [<User: 用户对象jsaon>]>
  33. # res = models.User.objects.filter(name='jsaon',age=19)
  34. # 3. first() last() QuerySet支持索引取值但是只支持正数 并且orm不建议你使用索引
  35. # res = models.User.objects.filter()[1]
  36. # res = models.User.objects.filter(pk=100)[0] # 数据不存在索引取值会报错
  37. # res = models.User.objects.filter(pk=100).first() # 数据不存在不会报错而是返回None
  38. # res = models.User.objects.filter(pk=100).last() # 数据不存在不会报错而是返回None
  39. # 4.update() 更新数据(批量更新)
  40. # models.User.objects.filter().update() # 批量更新
  41. # models.User.objects.filter(id=1).update() # 单个更新
  42. # 5.delete() 删除数据(批量删除)
  43. # models.User.objects.filter().delete() # 批量删除
  44. # models.User.objects.filter(id=1).delete() # 单个删除
  45. # 6.all() 查询所有数据 结果是QuerySet[数据对象1,数据对象2]
  46. # res = models.User.objects.all()
  47. # 7.values() 根据指定字段获取数据 结果是 QuerySet [{},{},{},{}]
  48. # res = models.User.objects.all().values('name')
  49. # res = models.User.objects.filter().values()
  50. # res = models.User.objects.values()
  51. # 8.values_list() 根据指定字段获取数据 结果是QuerySet [(),(),(),()]
  52. # res = models.User.objects.all().values_list('name','age')
  53. # 9.distinct() 去重 数据一定要一模一样才可以 如果有主键肯定不行
  54. # res = models.User.objects.values('name','age').distinct()
  55. # 10.order_by() 根据指定条件排序 默认是升序 字段前面加负号就是降序
  56. # res = models.User.objects.all().order_by('age')
  57. # 11. get() 根据条件筛选数据并直接获取到数据对象 一旦条件不存在会直接报错 不建议使用
  58. # res = models.User.objects.get(pk=1)
  59. # res = models.User.objects.get(pk=100,name='mmmm')
  60. # 12.exclude() 取反操作
  61. # res = models.User.objects.exclude(pk=11)
  62. # 13.reverse() 颠倒顺序(被操作的对象必须是已经排序的才可以)
  63. # res = models.User.objects.all().order_by('age') # <QuerySet [<User: 用户对象mmmm>, <User: 用户对象kevin>, <User: 用户对象tony>, <User: 用户对象kkkk>, <User: 用户对象llll>]>
  64. # res1 = models.User.objects.all().order_by('age').reverse() # <QuerySet [<User: 用户对象llll>, <User: 用户对象kkkk>, <User: 用户对象tony>, <User: 用户对象kevin>, <User: 用户对象mmmm>]>
  65. # 14 coint() 统计结果集中数据的个数
  66. # res = models.User.objects.all().count() # 5
  67. # 15.exists() 判断结果集中是否含有数据 如果有则返回 True 没有则返回False
  68. res = models.User.objects.all().exists() # True
  69. res1 = models.User.objects.filter(pk=100).exists() # False
  70. print(res)
  71. print(res1)
  72. main()

python之路49 模板层标签 自定义过滤器 模板继承、模型层准备、ORM部分操作的更多相关文章

  1. Django 笔记(四)模板标签 ~ 自定义过滤器

    模板标签: 标签在渲染的过程中提供任意的逻辑 语法: 由{% ... %} 和 {% end... %} 常用标签: with:类似取别名 模版继承: Django模版引擎中最强大也是最复杂的部分就是 ...

  2. Python - Django - 模板语言之自定义过滤器

    自定义过滤器的文件: 在 app01 下新建一个 templatetags 的文件夹,然后创建 myfilter.py 文件 这个 templatetags 名字是固定的,myfilter 是自己起的 ...

  3. Django - 环境搭建、url、视图、模板、标签、过滤器

    (一).简介 简介就不多说了,网上的内容一大堆.总结来说,django是走大而全的路线,写项目超级快,几乎什么都为你考虑到了,你就乖乖照着它的格式来写就行了. 这里来一些基本认知: web应用框架(w ...

  4. django模板中的自定义过滤器

    (1)在APP下创建templatetags文件夹,与Models.py.views.py等同级,templatetags文件夹下添加__init__.py文件,可为空,再添加一个模块文件,例如cpt ...

  5. Python之路-(js正则表达式、前端页面的模板套用、Django基础)

    js正则表达式 前端页面的模板套用 Django基础 js正则表达式: 1.定义正则表达式 /.../  用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m ...

  6. django系列4.2--自定义标签, 自定义过滤器, inclusion_tag, 引入静态文件(css,js等)

    项目的目录为 在app中创建templates时,最好要再创建一个app名相同的文件夹,因为项目找文件时从第一个app开始遍历,不同app内的同名文件会有冲突,所以这样处理 一.自定义标签和过滤器 1 ...

  7. 解决 idea template jsp模板中使用自定义路径 模板不显示问题

    ${} 是一个模板中的关键字,所以建立时需要用 \ 注释即可正常显示  ${APP_PATH}

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

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

  9. Django 模型层(标签、过滤器、模板的继承与导入)

    过滤器/自定义过滤器 模板语法中的过滤器类似于python中的内置方法,在我们把数据从后端通过rander传入到前端html文件中之后,在前端我们可以通过模板语法,对传入的数据再进行以通骚操作. 首先 ...

  10. Django 你需要掌握的模型层(标签、过滤器、模板的继承与导入)

    Django 模型层(标签.过滤器.模板的继承与导入) 好文章来自超哥:https://www.cnblogs.com/guanchao/p/11006062.html   过滤器/自定义过滤器 模板 ...

随机推荐

  1. MFC-创建MFC图形界面dll

    创建MFC图形界面dll 概述: 利用MFC的DLL框架,制作带有图形界面的dll,可以实现很多功能. 流程: 选择静态链接MFC DLL:以免有的库没有. 采用该框架创建的MFC,会自动生产一个MF ...

  2. Python解决千年虫问题

    #避免千年虫(日期bug)问题 千年虫:部分计算机程序使用年份后两位作为记录年份,当日期跳转到00时候,默认会解析为1900,造成系统紊乱 lst=[45,89,1998,00,75,33,1968, ...

  3. 通过netty把百度地图API获取的地理位置从Android端发送到Java服务器端

    本篇记录我在实现时的思考过程,写给之后可能遇到困难的我自己也给到需要帮助的人. 写的比较浅显,见谅. 在写项目代码的时候,需要把Android端的位置信息传输到服务器端,通过Netty达到连续传输的效 ...

  4. 使用HTML表单收集数据

    1.什么是表单 在项目开发过程中,凡是需要用户填写的信息都需要用到表单. #2.form标签 在HTML中我们使用form标签来定义一个表单.而对于form标签来说有两个最重要的属性:action和m ...

  5. 1.Django-Rest-Framework入门规范

    一.WEB应用模式   1.前后端不分离 前后端混合开发(前后端不分离),返回的是html的内容,需要渲染页面,写模版 2.前后端分离 专注于后端接口,返回json.xml格式的数据     二.AP ...

  6. SQL server 操作相关

    1.更改列的顺序后进行保存. 在SQL Server Management Studio中, "工具"--"选项"--"Designers" ...

  7. [C++] - GCC和LLVM对方法 warning: non-void function does not return a value [-Wreturn-type] 的处理差异

    最近做一个C++开源项目发现一个奇怪问题,通过clang编译链接执行程序每到有一个就崩溃了,gcc下则没有此问题. 后来通过调试,发现原因是bool返回的方法是没有return语句!问题是为啥还能通过 ...

  8. 如何精简 Prometheus 的指标和存储占用

    前言 随着 Prometheus 监控的组件.数量.指标越来越多,Prometheus 对计算性能的要求会越来越高,存储占用也会越来越多. 在这种情况下,要优化 Prometheus 性能, 优化存储 ...

  9. 使用位运算优化 N 皇后问题

    使用位运算优化 N 皇后问题 作者:Grey 原文地址: 博客园:使用位运算优化 N 皇后问题 CSDN:使用位运算优化 N 皇后问题 问题描述 N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇 ...

  10. bugku 矛盾

    我承认这道题给我上了一课.... 我觉得很简单的结果不是我想的那样.... 看到这道题我第一个反应是用ascii码表示1或则16进制,或则md5,或则url,base64结果都没对 ..... 去翻了 ...