上节Django-多表查询知识点回顾
models.py:
class Book(models.Model):
nid=models.AutoField(primary_key=True)
title=models.CharField(max_length=32)
# 书籍与出版社: 一对多
publisher=models.ForeignKey(to="Publish",related_name="bookList")
# 书籍与作者: 多对多
authors=models.ManyToManyField("Author")
class Publish(models.Model):
name=models.CharField(max_length=32)
class Author(models.Model):
name=models.CharField(max_length=32)
class AuthorDetail(models.Model):
addr=models.CharField(max_length=32)
author=models.OneToOneField("Author")
1、单表查询
models.Book.objects.all() # QuerySet []
models.Book.objects.filter(nid__gt=1,nid__lt=10) # QuerySet []
models.Book.objects.get() # model对象
models.Book.objects.values() # QuerySet [{},{}]
models.Book.objects.values_list()
models.Book.objects.exclude()
models.Book.objects.all().first()
models.Book.objects.all().last()
models.Book.objects.all().orderby()
models.Book.objects.all().reverse()
models.Book.objects.values("price").distinct()
models.Book.objects.all().count()
models.Book.objects.all().exist()
---- 双下划线:
models.Book.objects.filter(nid__gt=12)
models.Book.objects.filter(price__in=[112,223,444])
支持链式操作:
models.Book.objects.all().filter().orderby("id").count()
models.Book.objects.all().get().orderby("id").count()
1、跨表查询
---- 基于对象
(1) 查询Linux这本书的出版社名称和作者名字 属于正向查询 按关联字段
book_obj=models.Book.objects.get(title="linux")
book_obj.publisher.name
authors_list=book_obj.authors.all()
for author in authors_list:
print(author.name)
(2) 人民出版社出版过的所有书籍名称 属于反向查询 if 设置related_name,那么related_name的值,没有设置,按表明_set
publish_obj=models.Publish.objects.filter(name="人民出版社").first()
book_list=publish_obj.bookList.all()
for book in book_list:
print(book.title)
(3) alex 出版过的所有书籍的名称 属于反向查询 if 设置related_name,那么related_name的值,没有设置,按表明_set
alex=models.Author.objects.get(name="alex")
book_list=alex.book_set.all()
for book in book_list:
print(book.title)
(4) 作者alex的所在地址 正向查询 按字段 反向查询 按表名
alex=models.Author.objects.get(name="alex")
alex.authordetail.addr
---- 基于QuerySet 双下划线: 正向查询:按字段 反向查询:按表名 key: 1 过滤条件 2 查询结果
(1) 查询Linux这本书的出版社名称和作者名字 属于正向查询 按关联字段
models.Book.objects.filter(title="linux").values("publisher__name") # [{"publisher__name":"人民出版社"}]
models.Book.objects.filter(title="linux").values("authors__name") #
(2) 人民出版社出版过的所有书籍名称
models.Book.objects.filter(publisher__name="人民出版社").values("title")
models.Publish.objects.filter(name="人民出版社").values("book__title")
(3) alex 出版社过得所有书籍的名称
models.Book.objects.filter(authors__name="alex").values("title")
models.Author.objects.filter(name="alex").values("book__title")
今日内容:
1、 分页
2、 cookie session
3、 ajax (*************)
4、 form组件
1、分页
Pager项目 app01应用
为数据库Book添加100条数据
models:
class Book(models.Model):
name=models.CharField(max_length=32)
price=models.DecimalField(max_digits=7,decimal_places=2)
def add(request):
BookList=[]
for i in range(100):
BookList.append(models.Book(name="book"+str(i),price=30+i*i))
models.Book.objects.bulk_create(BookList)
return HttpResponse("OK")
数据库迁移:makemigrations/migrate
运行:127.0.0.1:8000/add
templates:
index.html
{% for book_obj in book_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ book_obj.title }}</td>
{# <td>{{ book_obj.pubDate|date:"Y-m-d" }}</td>#}
<td>{{ book_obj.price }}</td>
分页器的引入
2、cookie session
cookie: 保留在客户端(浏览器)的存放键值对的容器 {"":""}
session: 保留在服务器上的一个容器 {"":""}
def login:
if 1:
request.session["is_login_egon"]=True
request.session["username"]="alex"
# 赋值session实现了什么
(1) django---写好响应cookie:{"sessionID":"123asdas12312"}
(2) 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 ,实现了什么
(1) dajngo-- 先获取cookie的sessionID: 123asdas12312
(2) django---ret=models.django_session.objects,filter(session-key="123asdas12312")
(3) 我们自己实现的:ret["is_login_egon"]
return redirect("/login/")
{"sessionID"L:""}
会话---session
注销---清除session
request.session.flush()
(1) dajngo-- 先获取cookie的sessionID: 123asdas12312
(2) django---ret=models.django_session.objects.filter(session-key="123asdas12312")
(3) flush:ret.delete()
views.py:
def login(request):
if request.method == "POST":
username = request.POST['user']
password = request.POST['pwd']
user = models.UserInfo.objects.filter(name=username, pwd=password)
if user:
# 设置session内部的字典内容
request.session['is_login'] = 'true'
request.session['username'] = username
# 登录成功就将url重定向到后台的url
return redirect('/index/')
# 登录不成功或第一访问就停留在登录页面
return render(request, 'login.html')
def index(request):
print(request.session, "------cookie")
print(request.COOKIES, '-------session')
"""
这里必须用读取字典的get()方法把is_login的value缺省设置为False,
当用户访问backend这个url先尝试获取这个浏览器对应的session中的
is_login的值。如果对方登录成功的话,在login里就已经把is_login
的值修改为了True,反之这个值就是False的
"""
is_login = request.session.get('is_login', False)
# 如果为真,就说明用户是正常登陆的
if is_login:
# 获取字典的内容并传入页面文件
cookie_content = request.COOKIES
session_content = request.session
username = request.session['username']
return render(request, 'index.html', locals())
else:
"""
如果访问的时候没有携带正确的session,
就直接被重定向url回login页面
"""
return redirect('/login/')
def log_out(request):
"""
直接通过request.session['is_login']回去返回的时候,
如果is_login对应的value值不存在会导致程序异常。所以
需要做异常处理
"""
try:
# 删除is_login对应的value值
del request.session['is_login']
# OR---->request.session.flush() # 删除django-session表中的对应一行记录
except KeyError:
pass
# 点击注销之后,直接重定向回登录页面
return redirect('/login/')
auth模块:
使用 create_user 辅助函数创建用户:
from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')
views:
def login(request):
if request.method == "POST":
username = request.POST['user']
password = request.POST['pwd']
# user = models.UserInfo.objects.filter(name=username, pwd=password)
#auth模块
user=auth.authenticate(username=username,password=password)
print("=========",user)
if user is not None:
# 设置session内部的字典内容
# request.session['is_login'] = 'true'
# request.session['username'] = username
#auth模块
auth.login(request,user)
# 登录成功就将url重定向到后台的url
return redirect('/index/')
# 登录不成功或第一访问就停留在登录页面
return render(request, 'login.html')
def index(request):
# auth模块
if request.user.is_authenticated():
# username = request.session['username']
return render(request, 'index.html')
else:
"""
如果访问的时候没有携带正确的session,
就直接被重定向url回login页面
"""
return redirect('/login/')
客户端---》服务器
地址栏
a标签
form post
form get
ajax(js)
AJAX:
异步
局部刷新
ajax步骤:
第一步:
确定事件
第二部:
$.ajax({
url:"",
type:"",
success:function(data){ // data:响应数据
}
})
作业1:
把登录验证的session做成装饰器
作业2:
ajax实现登录与注册
作业3:
数据库表
class Articel
id
title
desc
time
user=...
class user