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 
  
  
 
 

  

原文地址:https://www.cnblogs.com/liweijing/p/7940366.html