python_day20 Django分页器,Cookies&Session,auth模块,Ajax
上节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