Django复习:
MTV模型:
manager启动服务→urls找到路径→(找到views视图函数或者做路由分发)→视图函数处理相关逻辑,返回一个模板或者是字符串:
-------------------------------------------------------------------------------------------------------------------- URLS:
-------起别名是为了反向解析
urlpattern = [
(正则表达式,include(分发路径)),
(正则表达式,views视图函数),
(?P<name>正则,views视图函数)
] --------------------------------------------------------------------------------------------------------------------
views:
客户端通过url路径找到要访问的视图函数,
def func(request):
return Httpresponse("string") def func(request):
return render(request,"model",locals()) def func(request):
return redirect("/url/") 浏览器返回的信息都在request里,可以通过request. 的方法获取到某一个值: -------------------------------------------------------------------------------------------------------------------- template:
模板(前端页面): ----->模板中的都是经过上下文处理的字符串
模板语法:
{% url "/../" 参数 %} {{ locals }}
{% for i in locals %}
for循环体,循环传过来的上下文对象
{% endfor %}} {% if locals %} ....... {% endif %}
{% with locals %} ....... {% endwith %} ------------------------------------------------------------------------------------------------------------------
模板继承: 母版(base.html):被继承的模板,一般不在前端页面展示 (模板中的block可以看做你自己挖的坑,一块一个坑,为了区分就起了名字name)
{{ block name }} 继承的内容 {{ endblock }}
name:有可能要继承多个块,所以起名字会方便, 子板:要继承的模板,用户可以访问的页面 子板要继承模板的内容必须导入{{ extend "base.html" }}
接下来自己就可以填母版挖的坑了,当然不填也可以,不过会继承模板的所有,挖坑只是为了方便重写
(假如要展示的页面有成千上百个,但是大致的内容都一样,要是自己写难免太多重复代码,此时就有了继承,多个子页面继承base页面,到时候根据需求分别填坑 {{ block name }} .....重写的代码 {{ endblock }} 理论上来说一个endblock就已经够了,可是为了方便阅读就每个block加上一个endblock!) 静态文件的配置: --------------------------------------------------------------------------------------------------------------------------
model:
数据库处理相关:
用类的方法创建数据表:类名---->表名:属性---->字段名:数据---->实例化对象
插入数据:
普通字段:
obj = 对象实例化
obj.save() --------->插入数据
models.表名.object.creat(key=value,)
models.表名.object.bulk_creat(批量插入数据)
外键字段:
1、先获取到外键的对象,然后用一个变量接收,表名.object.creat(字段=数据)
2、直接用表名.objects.creat(表名=字段名,外键=。。)
多对多字段:
1、多对多的外键字段实例化得到两个对象;
2、用一个列表接收这两个对象;
3、表名.外键字段.add(2)
4、表名.外键字段.create()
解除关系:
对象.外键.remove() --------->去除
对象.外键.clear() --------->清空对象集合 更新数据:
models.表名.object.filter(条件).update(key=value) 删除数据:
models.表名.object.filter(条件).delete 查找数据:
13个查找相关的API:
all() 查询所有的结果:
filter(**kwargs) 过滤匹配到的对象
get(**kwargs) 获取到一个对象,没有结果报错
exclude(**kwargs) 与筛选结果不匹配的对象
values(*field) 可迭代的字典序列
values_list(*field) 返回的是一个元组序列-----可以循环取值
order_by(*field) 对查询的结果进行排序
reverse() 对查询结果进行反向排序
distinct() 去掉重复记录
count() 返回queryset集合的对象数量
first() 返回第一条记录
last() 返回最后一条记录
exists() 如果该集合包含数据就返回true,else:False
-------------------------------------------------------------------------------------
QuerySet集合对象:
models.表名.objects.all()
models.表名.objects.filter(**kwargs)
models.表名.objects.all().values(*args)
models.表名.objects.all().values_list(*args)
--------------------------------------------------------------------------------------
models.表名.objects.exclude(**kwargs)
models.表名.objects.order_by(*args)
models.表名.objects.distinct(*args) model对象:
models.表名.objects.get(**kwargs)
--------------------------------------------------------------------------------------
models.表名.objects.filter(**kwargs).first()
models.表名.objects.filter(**kwargs).last()
models.表名.objects.filter(**kwargs).count()
models.表名.objects.filter(**kwargs).exist() ---------------------------------------------------------------------------------------
正向查询按字段直接.,反向查询按表名[当前表.关联表_set. ,]
双下划线单表查询:
当筛选条件里面要过滤出一个范围的时候,那些简单的查询就已经不够用了,此时就出来了双下划线:
eg:models.table.object.filter(id__lt-10,id__gt=1) 过滤1<id<10的数据
(类似的:__in=[....],__contains,__icontains,大小写; __range= [start,end])
双下划线的跨表查询:
表名.objects.filter(关联表__字段=“..”).values_list(查出来的数据,用户能看到的)
外键字段的表名.objects.filter(条件).values_list(被关联表__字段) 分组和聚合:
aggregate是queryset的一个终止自居,返回包含键值对的字典,键的名称是标识符,值是计算出来的聚合值
聚合:aggregate(*args,**kwargs)
Book.objects.all().aggregate(Avg("x"))
获取到所有的book值,求字段x的平均值 得到的结果是一个字典{"x__avg":num}
当然还可以为这个聚合值指定一个名称:
Book.objects.aggregate(average_price=Avg('x')) 得到的结果是:{"average_price":num}
分组:annotate() 为每一个对象生成一个独立的汇总值,和MySQL数据库的分组类似
booklist = Book.objects.annotate(authorNum = Count("x"))
得到的对象是一个queryset集合,,可以用for循环遍历,,便利的结果可以同.字段名的方式取值
annotate的返回值是queryset对象,如果不想遍历可以用valuelist接收 F查询与Q查询:
F查询:
当两个字段需要做比较的时候就会用到: F() 与 F() 可以进行加减乘除和取模操作:
Q查询:
Q对象可以使用&与|操作符组合起来,当一个操作符在两个Q对象之间使用将返回一个新的Q对象;
Q 对象还可以使用~去反操作
【Book.objects.filter(Q(authors__name="Mr_zhang")|Q(authors__name="egon"))==where name="Mr_zhang" or name="egon"】 过滤器: cookie和session
cookie:数据存在客户端,不安全
session:数据存在服务器,安装
1、在登录页面设置cookie或者谁session
2、在需要验证的页面校验cookie或者是session
3、为了少写代码,直接写获取值的auth装饰器 auth 模块
auth模块完成的是就是cookie和session的事
user = authenticate(username=username,password=password)
当user获取到值说明验证通过了,
login(request,user) ----------------自动帮你设置session
logout:在函数内部logout(request) ----------直接注销登录
对于验证我们为了简单早就写了弍模块:
@login_required
当把这个装饰器加到需要验证的页面,这个页面不可以直接访问,,而要通过验证才可以: 登录验证(user)
is_authenticated() --验证通过,返回Trun
创建用户:
user User.objects.creat_user(。。。。。。。。。)
修改密码:要输入原来的密码才让修改:
user = User.objects.get(username="")
user.set_password(password="new_password")
user.save ---------不写save不会保存在数据库中 分页器:
有时候数据库的数据太多的话所有的数据都展示在同一个页面上,不方便浏览,也不利于管理:
此时就出来了一个叫做分页器的概念:
导入模块:from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
先查询一下所有的书:book_list = Book.object.all()
paginator = Paginator(book_list,10) #每页显示10行数据
paginator.count ------------->总的数据有多少行
paginator.num_pages ---------->得到总的页数
paginator.page_range -----------页码的列表 page1 = paginator.page(1) -----获取到第一页的page对象
page1 可以遍历,,得到的结果就是这个页面上的10条数据
page1.object_list() -------得到第一页的所有数据
---------------------------------------------------------------------------------
page2 = paginator.page(2) ---------拿到第二页
page2.has_next() -------------判断是否有下一页
page2.next_page_number() ---------------下一页的页面
page2.has_previous() ---------判断是否有上一页
page2.previous_page_number() --------------上一页的页码
ps:page不到数据的时候或者page的数据是错误的话会抛错 前端处理数据:
上一页 中间页 下一页
判断booklist有没有上一页
for循环中间页
判断booklist有没有下一页

  

django笔记整理的更多相关文章

  1. 运维开发笔记整理-Django模型语法

    运维开发笔记整理-Django模型语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.模型基本概念 1>.什么是模型 模型是你的数据唯一的,权威的信息源.它包含你所存储数 ...

  2. 运维开发笔记整理-django日志配置

    运维开发笔记整理-django日志配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Django日志 Django使用python内建的logging模块打印日志,Pytho ...

  3. 运维开发笔记整理-创建django用户

    运维开发笔记整理-创建django用户 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.创建普通用户 C:\Users\yinzhengjie\softwares\Pycharm ...

  4. 运维开发笔记整理-使用Django编写helloworld

    运维开发笔记整理-使用Django编写helloworld 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.创建Django项目 1>.创建Django项目 djang ...

  5. 运维开发笔记整理-基于类的视图(CBV)

    运维开发笔记整理-基于类的视图(CBV) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.FBV与CBV 1>.什么是FBV FBC(function base views ...

  6. 运维开发笔记整理-URL配置

    运维开发笔记整理-URL配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.URL路由 对于高质量的Web应用来说,使用简洁,优雅的URL的路由是一个非常值得重视的细节.Dja ...

  7. 运维开发笔记整理-QueryDict对象

    运维开发笔记整理-QueryDict对象 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 客户端发送数据请求有很多种,相信运维人员已经很清楚了,如果不太清楚的话可以参考我之前的学习笔 ...

  8. 运维开发笔记整理-template的使用

    运维开发笔记整理-Django的template的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在上一篇博客中我们学习了HttpResponse 和JsonResponse方 ...

  9. 运维开发笔记整理-JsonResponse对象

    运维开发笔记整理-JsonResponse对象 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用HttpResponse发送json格式的数据 1>.HttpRespo ...

随机推荐

  1. 此地址使用了一个通常用于网络浏览以外目的的端口。出于安全原因,Firefox 取消了该请求。

    火狐无法访问本机IIS部署的网站,弹出:此地址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求 的解决办法 关于火狐浏览器访问本机IIS部署的网站弹出"此 ...

  2. 解决[babel] note:the code generator has deoptimised the styling...

    在使用webpack的babel-loader编译es6的js文件时,出现了如题的提示. 解决方法如下: loaders: [ { test: /\.js$/, loader: 'babel', qu ...

  3. seleniumPO模式

    一.框架目录结构 二.代码 2.1page层代码 package com.mianshui.page; import org.openqa.selenium.WebElement; import or ...

  4. android studio 环境变量配置

    1.需要添加path环境变量: 2.真机调试或模拟器调试需要启动adb adb kill-severadb -start-server可能有端口冲突--重启或者修改端口 创建密匙http://blog ...

  5. Spark源码剖析(一):如何将spark源码导入到IDEA中

    由于近期准备深入研究一下Spark的核心源码,所以开了这一系列用来记录自己研究spark源码的过程! 想要读源码,那么第一步肯定导入spark源码啦(笔者使用的是IntelliJ IDEA),在网上找 ...

  6. ArcGIS 网络分析[1.2] 利用1.1的线shp创建网络数据集/并简单试验最佳路径

    上篇已经创建好了线数据(shp文件格式)链接:点我 这篇将基于此shp线数据创建网络数据集. 在此说明:shp数据的网络数据集仅支持单一线数据,也就是说基于shp文件的网络数据集,只能有一个shp线文 ...

  7. open-falcon(v0.2)部署手册(源码编译)

    今天安装falcon-plus,下面为用基础环境配置. centos 6.8  alisql5.6.32   redis-3.2.8 cmake-3.9.1 bison-3.0 openssl-1.0 ...

  8. UVA 10891 Game of Sum

    题目大意就是有一个整数串,有两个人轮流取,每次可以取走一个前缀或后缀.两人都足够聪明,且都会使自己收益最大.求取完后先手比后手多多少. 每次我看见上面那句就会深感自己的愚笨无知. 所以来推推性质? 1 ...

  9. 正则表达式与grep

    一.回溯引用 1.将页面中合法的标题找出来,使用回溯引用匹配 (需要使用 -E 或 -P 来扩展grep语法支持) 2.查找连续出现的单词 二.前后查找 (grep 只能使用 -P 选项) 1. 向前 ...

  10. 论文笔记-Squeeze-and-Excitation Networks

    作者提出为了增强网络的表达能力,现有的工作显示了加强空间编码的作用.在这篇论文里面,作者重点关注channel上的信息,提出了"Squeeze-and-Excitation"(SE ...