老师网址:

https://www.cnblogs.com/yuanchenqi/articles/7652353.html

1,复习上级课,一对一,一对多,多对多的使用

models.py: 

class Book(models.Model):

    nid=models.AutoField(primary_key=True)
title=models.CharField(max_length=) # 书籍与出版社: 一对多
publisher=models.ForeignKey(to="Publish",related_name="bookList") # 书籍与作者: 多对多
authors=models.ManyToManyField("Author") class Publish(models.Model): name=models.CharField(max_length=) class Author(models.Model):
name=models.CharField(max_length=) class AuthorDetail(models.Model): addr=models.CharField(max_length=)
author=models.OneToOneField("Author") 、单表查询 models.Book.obejcts.all() # QuerySet []
models.Book.obejcts.filter(nid__gt=,nid__lt=) # QuerySet []
models.Book.obejcts.get() # model对象
models.Book.obejcts.values() # QuerySet [{},{}]
models.Book.obejcts.values_list()
models.Book.obejcts.exclude()
models.Book.obejcts.all().first()
models.Book.obejcts.all().last()
models.Book.obejcts.all().orderby()
models.Book.obejcts.all().reverse()
models.Book.obejcts.values("price").distinct()
models.Book.obejcts.all().count()
models.Book.obejcts.all().exist() ---- 双下划线:
models.Book.obejcts.filter(nid__gt=)
models.Book.obejcts.filter(price__in=[,,]) 支持链式操作:
models.Book.obejcts.all().filter().orderby("id").count()
models.Book.obejcts.all().get().orderby("id").count() 、跨表查询 ---- 基于对象 () 查询Linux这本书的出版社名称和作者名字 属于正向查询 按关联字段
book_obj=models.Book.obejcts.get(title="linux")
book_obj.publisher.name authors_list=book_obj.authors.all()
for author in authors_list:
print(author.name) () 人民出版社出版过的所有书籍名称 属于反向查询 if 设置related_name,那么related_name的值,没有设置,按表明_set
publish_obj=models.Publish.obejcts.filter(name="人民出版社").first()
book_list=publish_obj.bookList.all()
for book in book_list:
print(book.title) () alex 出版社过得所有书籍的名称 属于反向查询 if 设置related_name,那么related_name的值,没有设置,按表明_set
alex=models.Author.obejcts.get(name="alex")
book_list=alex.book_set.all()
for book in book_list:
print(book.title) () 作者alex的所在地址 正向查询 按字段 反向查询 按表名
alex=models.Author.obejcts.get(name="alex")
alex.authordetail.addr ---- 基于QuerySet 双下划线: 正向查询:按字段 反向查询:按表名 key: 过滤条件 查询结果 () 查询Linux这本书的出版社名称和作者名字 属于正向查询 按关联字段 models.Book.obejcts.filter(title="linux").values("publisher__name") # [{"publisher__name":"人民出版社"}]
models.Book.obejcts.filter(title="linux").values("authors__name") # () 人民出版社出版过的所有书籍名称 models.Book.obejcts.filter(publisher__name="人民出版社").values("title") models.Publish.obejcts.filter(name="人民出版社").values("book__title") () alex 出版社过得所有书籍的名称 models.Book.obejcts.filter(authors__name="alex").values("title") models.Author.obejcts.filter(name="alex").values("book__title")

2,分页怎么做的:

如果说短时间内一条条的添加数据的话,可能会造成服务器压力太大。

可以将要创建的数据打包,然后在一起放入数据库。

def add(request):
Booklist = []
for i in range():
book_obj=models.Book(title="book" + str(i), price= + i * i)
Booklist.append(book_obj) models.Book.objects.bulk_create(Booklist)

先引用一个变量:

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

paginator(book_list,8)

# book_list:是你要分页的数据

#  8: 每页数据的条数

'''
分页器的使用:
book_list=Book.objects.all()
paginator = Paginator(book_list, )
print("count:",paginator.count) #数据总数
print("num_pages",paginator.num_pages) #总页数
print("page_range",paginator.page_range) #页码的列表 page1=paginator.page() #第1页的page对象
for i in page1: #遍历第1页的所有数据对象
print(i)
print(page1.object_list) #第1页的所有数据 page2=paginator.page() print(page2.has_next()) #是否有下一页
print(page2.next_page_number()) #下一页的页码
print(page2.has_previous()) #是否有上一页
print(page2.previous_page_number()) #上一页的页码 # 抛错
#page=paginator.page() # error:EmptyPage
#page=paginator.page("z") # error:PageNotAnInteger '''

可以利用bootstrap来进行样式改:

怎么遍历显示图标数字:

{% for i in page_range %}
<li><a href="/?p={{i}}">{{i}}></a></li>
{% endfor %} shangyiye: xiayiye:

3, cookie和session:

    cookie: 保留在客户端(浏览器)的存放键值对的容器  {"":""}    

    session: 保留在服务器上的一个容器     {"":""}         

    def login:
if :
request.session["is_login_egon"]=True
request.session["username"]="alex" # 赋值session实现了什么
() django---写好响应cookie:{"sessionID":"123asdas12312"}
() dajngo--- 在django-session表中创建一条记录 session-key session-data
123asdas12312 {"is_login_egon":True,"username":"alex"} def index:
if not request.session.get("is_login_egon"):
# 取值session ,实现了什么
() dajngo-- 先获取cookie的sessionID: 123asdas12312
() django---ret=models.django_session.objects,filter(session-key="123asdas12312") () 我们自己实现的:ret["is_login_egon"] return redirect("/login/") {"sessionID"L:""} 会话---session
注销---清除session
request.session.flush() () dajngo-- 先获取cookie的sessionID: 123asdas12312
() django---ret=models.django_session.objects.filter(session-key="123asdas12312") () flush:ret.delete()

4,auth模块

直接在Terminal中可以创建用户:

python manage createsuperuser

auth的引入:

from django.contrib import auth

 、authenticate()   

提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数

如果认证信息有效,会返回一个  User  对象。authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的!!

user =authenticate(username='someone',password='somepassword')

注销页面:

 、login(HttpRequest, user)  

该函数接受一个HttpRequest对象,以及一个认证了的User对象

此函数使用django的session框架给某个已认证的用户附加上session id等信息。

from django.contrib.auth import authenticate, login

def my_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
# Redirect to a success page.
...
else:
# Return an 'invalid login' error message.
...
、logout(request) 注销用户   from django.contrib.auth import logout def logout_view(request):
logout(request)
# Redirect to a success page.
该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。 、user对象的 is_authenticated() 要求: 用户登陆后才能访问某些页面, 如果用户没有登录就访问该页面的话直接跳到登录页面 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址 方法1: def my_view(request):
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
方法2: django已经为我们设计好了一个用于此种情况的装饰器:login_requierd() from django.contrib.auth.decorators import login_required @login_required
def my_view(request):
...
若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' (这个值可以在settings文件中通过LOGIN_URL进行修改)。并传递 当前访问url的绝对路径 (登陆成功后,会重定向到该路径)

5,session配置:

数据库配置:

Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。

a. 配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)

    SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)

缓存配置:

a. 配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = # Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存

文件配置:

a. 配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = # Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存

Day20 Django的使用_基础的更多相关文章

  1. web前端学习python之第一章_基础语法(二)

    web前端学习python之第一章_基础语法(二) 前言:最近新做了一个管理系统,前端已经基本完成, 但是后端人手不足没人给我写接口,自力更生丰衣足食, 所以决定自学python自己给自己写接口哈哈哈 ...

  2. web前端学习python之第一章_基础语法(一)

    web前端学习python之第一章_基础语法(一) 前言:最近新做了一个管理系统,前端已经基本完成, 但是后端人手不足没人给我写接口,自力更生丰衣足食, 所以决定自学python自己给自己写接口哈哈哈 ...

  3. Django学习笔记(基础篇)

    Django学习笔记(基础篇):http://www.cnblogs.com/wupeiqi/articles/5237704.html

  4. SSM整合_年轻人的第一个增删改查_基础环境搭建

    写在前面 SSM整合_年轻人的第一个增删改查_基础环境搭建 SSM整合_年轻人的第一个增删改查_查找 SSM整合_年轻人的第一个增删改查_新增 SSM整合_年轻人的第一个增删改查_修改 SSM整合_年 ...

  5. Python学习-day20 django进阶篇

    Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...

  6. Day20 Django之Model多对多、中间件、缓存、信号和分页

    一.Form补充 class IndexForm(forms.Form): # c = [ # (1, 'CEO'), # (2, 'CTO') # ] # 静态字段,属于IndexForm类,即使数 ...

  7. CI下载与安装_基础配置_MVC

    CI:CodeIgniter -- 由Ellislab公司的CEORickEllis开发,是一个简单快速的PHP MVC框架. =============下载和安装================地址 ...

  8. Django框架第一篇基础

    一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model(模型):和数据库相关的,负 ...

  9. Django框架之模板基础,静态文件配置

    一.模板继承 目的是:减少代码的冗余 语法: {% block classinfo %} {% endblock %} 具体步骤: 1.创建一个base.html文件,2.把要显示的页面的内容写在这里 ...

随机推荐

  1. CentOS上PHP完全卸载

    想把PHP卸载干净,直接用yum的remove命令是不行的,需要查看有多少rpm包,然后按照依赖顺序逐一卸载. 1.首先查看机器上安装的所有php相关的rpm包 [root@localhost ngi ...

  2. Linux驱动基础:MSM平台AP/CP通信机制

    点击打开链接 概述 MSM平台AP和CP封装到一个芯片,共享内容.所以之前也说过,高通的MSM解决方案中,CP的代码都是由AP放到指定地址的内存中以供CP运行.那上传完代码,CP开始跑之后,AP/CP ...

  3. Uva - 210 - Concurrency Simulator

    自己写个双端队列,或者直接用deque,这个也比较好用 AC代码: #include <iostream> #include <cstdio> #include <cst ...

  4. 【Unity Shaders】Reflecting Your World —— Unity3D中简单的Cubemap反射

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  5. 【shell脚本练习】grep sed awk

    下面是简单学习之后做得练习题,如果有不对的或者说解题思路不好的,请交流啊. Grep 练习 文件名grepfile Steve Blenheim:238-923-7366:95 Latham Lane ...

  6. iOS&nbsp;动画总结—UIView动画

    1.概述 UIKit直接将动画集成到UIView类中,实现简单动画的创建过程.UIView类定义了几个内在支持动画的属性声明,当这些属性发生改变时,视图为其变化过程提供内建的动画支持. 执行动画所需要 ...

  7. 客户地点分配多OU

    DECLARE l_num_user_id NUMBER; l_num_appl_id NUMBER; l_num_resp_id NUMBER; cust_account_rec_type hz_c ...

  8. Android ViewManager解读之requestLayout() 详解

    尊重原创: http://blog.csdn.net/sk719887916/article/details/48464035 上篇<Android View 中invalidate() 你所不 ...

  9. 【算法导论】单源最短路径之Bellman-Ford算法

    单源最短路径指的是从一个顶点到其它顶点的具有最小权值的路径.我们之前提到的广度优先搜索算法就是一种无权图上执行的最短路径算法,即在所有的边都具有单位权值的图的一种算法.单源最短路径算法可以解决图中任意 ...

  10. JQuery实战总结一 可编辑的表格

    JQuery视频看完了,总结学习,记得在牛腩视频中的修改新闻类别的时候也使用了这样的可编辑的表格,使用到 了ajax控制界面不再刷新,轻松解决了类别的名称的修改的问题,直接提交到数据库,这样的方式比起 ...