模板层 后端朝html页面传递数据 两种给html页面传递数据的方式 第一种: render(request,'index.html',{'user_list':user_list}) 第二种 render(request,'index.html',locals()) 后端能够给html传递的数据有哪些 python全部的基本数据类型 函数名(传函数名会自动加括号执行) 对象(至关于在前端页面打印了该对象) 前端访问容器类型数据的属性或方法统一采用句点符(.) 有序类型 直接点索引访问 字典 直接点key 在调用函数或方法的时候不支持传参 过滤器 n|length 统计长度 n|default:'不存在' n|date:'Y-m-d' n|filesizeformat n|slice:'0:8:2' n|truncatechars:10 n|truncatewords:10 n|add:1 n|safe 先后端取消转义的方式 前端转义 |safe 后端转义 from django.utils.safestring import mark_safe() mark_safe("<h1>我是h1标签</h1>") 标签 {% for foo in user_list%} {{ foo }} {{ forloop }} {% empty %} 当传递给个人循环对象是个空的状况下才会走empty下面的代码块 {% endfor %} {% if flag %} flag有值 {% elif tag %} tag有值 {% else %} 两个都没值 {% endif %} 前端模板语法for循环和if判断也能够嵌套使用 {% with hobby.2.1.2.1.2.3.4.3 as h%} {{ h }} {{ hobby.2.1.2.1.2.3.4.3 }} {% endwith %} 自定义过滤器,标签,inclusion_tag 必备三步走战略 1.在应用下新建一个名字必须叫作templatetags文件夹 2.在新建的文件夹下新建一个任意名的py文件(my_tag.py) 3.在新建的py文件中固定写下面两句话 from django import template register = template.Library() # 自定义过滤器 @register.filter(name='baby') def index(a,b): return a+b # 自定义标签 @register.simple_tag(name='index') def index(a,b,c,d): return a+b+c+d # 自定义inclusion_tag @register.inclusion_tag('login.html',name='xxx') def index(n): # 产生login.html小页面所须要的数据 return {"data":data} html中如何使用自定义的过滤器,标签,inclusion_tag # 先加载 {% load my_tag %} {{ num|baby:10 }} {% index 1 2 3 4 %} {% xxx 10 %} 模板的继承与导入 index.html {% block content %} 主页内容 {% endblock %} 继承模板 {% extends 'index.html'%} {% block content %} {{ block.super }} 子页面内容 {% endblock %} 模板的导入 {% include 'login.html' %} ps:一个模板中一般block块儿越多页面的可扩展性越强 通常习惯性的取三块儿内容 css content js 静态文件配置 {% load static %} 两种动态获取路径的方式 <link rel='stylesheet' href="{% static 'css/mycss.css'%}"> # 第一种方式 <link rel='stylesheet' href="{% get_static_prefix %}css/mycss.css"> # 第二种方式 模型层 django ORM操做 关键性字段及参数 DateField 年月日 DateTimeField 年月日时分秒 auto_now:每次操做改数据都会自动更新时间 auto_now_add:新增数据的时候会将当前时间自动添加,后续的修改该字段不会自动更新 单独的py文件测试ORM操做须要配置的参数 import os if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day58.settings") import django django.setup() from app01 import models # 这一句话必须在这下面导入 主要是queryset对象就能够无限制的点queryset方法(*******************) models.User.objects.filter().filter().filter().count() 单表查询 **********************************查询方法****************************************** <1> all(): 查询全部结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,若是符合筛选条件的对象超过一个或者没有都会抛出错误。(源码就去搂一眼~诠释为什么只能是一个对象) <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <5> order_by(*field): 对查询结果排序('-id')/('price') <6> reverse(): 对查询结果反向排序 >>>前面要先有排序才能反向 <7> count(): 返回数据库中匹配查询(QuerySet)的对象数量。 <8> first(): 返回第一条记录 <9> last(): 返回最后一条记录 <10> exists(): 若是QuerySet包含数据,就返回True,不然返回False <11> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后获得的并非一系列 model的实例化对象,而是一个可迭代的字典序列 <12> values_list(*field): 它与values()很是类似,它返回的是一个元组序列,values返回的是一个字典序列 <13> distinct(): 从返回结果中剔除重复纪录 返回queryset对象的方法 all() filter() exclude() order_by() reverse() distinct() values() 返回一个可迭代的字典序列 values_list() 返回一个可迭代的元祖序列 多表查询 表与表之间的关系 一对一(OneToOneField):一对一字段不管建在哪张关系表里面均可以,可是推荐建在查询频率比较高的那张表里面 一对多(ForeignKey):一对多字段建在多的那一方 多对多(ManyToManyField):多对多字段不管建在哪张关系表里面均可以,可是推荐建在查询频率比较高的那张表里面 ps:如何判断表与表之间究竟是什么关系 换位思考 A能不能有多个B B能不能有多个A add() # 添加 set() # 修改 remove() # 不能接收可迭代对象 clear() # 清空 不用传参 正向与反向的概念 正向查询按字段,反向查询按表名小写... # 一对一 # 正向:author---关联字段在author表里--->authordetail 按字段 # 反向:authordetail---关联字段在author表里--->author 按表名小写 # 查询jason做者的手机号 正向查询 # 查询地址是 :山东 的做者名字 反向查询 # 一对多 # 正向:book---关联字段在book表里--->publish 按字段 # 反向:publish---关联字段在book表里--->book 按表名小写_set.all() 由于一个出版社对应着多个图书 # 多对多 # 正向:book---关联字段在book表里--->author 按字段 # 反向:author---关联字段在book表里--->book 按表名小写_set.all() 由于一个做者对应着多个图书 # 查询出版社是东方出版社出版的书籍 一对多字段的反向查询 # publish_obj = models.Publish.objects.filter(name='东方出版社').first() # print(publish_obj.book_set) # app01.Book.None # print(publish_obj.book_set.all()) # 查询做者jason写过的全部的书 多对多字段的反向查询 # author_obj = models.Author.objects.filter(name='jason').first() # print(author_obj.book_set) # app01.Book.None # print(author_obj.book_set.all()) # 查询做者电话号码是110的做者姓名 一对一字段的反向查询 # authordetail_obj = models.AuthorDetail.objects.filter(phone=110).first() # print(authordetail_obj.author.name) F与Q查询 配置文件配置参数查看全部orm操做内部的sql语句 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }