zoukankan      html  css  js  c++  java
  • Day20 Django的使用_基础

    老师网址:

    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=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.obejcts.all()       #   QuerySet    []        
           models.Book.obejcts.filter(nid__gt=1,nid__lt=10)  #   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=12)    
            models.Book.obejcts.filter(price__in=[112,223,444])    
           
        支持链式操作:   
             models.Book.obejcts.all().filter().orderby("id").count() 
             models.Book.obejcts.all().get().orderby("id").count() 
             
    1、跨表查询
    
       ----  基于对象
       
             (1) 查询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)    
             
             (2) 人民出版社出版过的所有书籍名称   属于反向查询  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)
                      
             (3) 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)    
                      
             (4) 作者alex的所在地址  正向查询 按字段  反向查询 按表名
                 alex=models.Author.obejcts.get(name="alex")
                 alex.authordetail.addr
                 
                  
        ----  基于QuerySet   双下划线:   正向查询:按字段     反向查询:按表名    key:  1 过滤条件  2 查询结果
    
             (1) 查询Linux这本书的出版社名称和作者名字   属于正向查询  按关联字段
                  
                 models.Book.obejcts.filter(title="linux").values("publisher__name") # [{"publisher__name":"人民出版社"}]
                 models.Book.obejcts.filter(title="linux").values("authors__name")   #
                 
                 
             (2) 人民出版社出版过的所有书籍名称 
                 
                 models.Book.obejcts.filter(publisher__name="人民出版社").values("title")
    
                 models.Publish.obejcts.filter(name="人民出版社").values("book__title")         
                 
             (3) 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(100):
            book_obj=models.Book(title="book" + str(i), price=60 + 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, 10)
        print("count:",paginator.count)           #数据总数
        print("num_pages",paginator.num_pages)    #总页数
        print("page_range",paginator.page_range)  #页码的列表
    
    
        page1=paginator.page(1) #第1页的page对象
        for i in page1:         #遍历第1页的所有数据对象
            print(i)
        print(page1.object_list) #第1页的所有数据
    
        page2=paginator.page(2)
    
        print(page2.has_next())            #是否有下一页
        print(page2.next_page_number())    #下一页的页码
        print(page2.has_previous())        #是否有上一页
        print(page2.previous_page_number()) #上一页的页码
    
    
        # 抛错
        #page=paginator.page(12)   # 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 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()
               

    4,auth模块

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

    python manage createsuperuser

    auth的引入:

    from django.contrib import auth

    1 、authenticate()   
    
    提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数
    
    如果认证信息有效,会返回一个  User  对象。authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的!!
    
    
    user =authenticate(username='someone',password='somepassword')

    注销页面:

    2login(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.
        ...
    3 、logout(request) 注销用户  
    
    from django.contrib.auth import logout
       
    def logout_view(request):
      logout(request)
      # Redirect to a success page.
    该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
    
    4 、user对象的 is_authenticated()
    
    要求:
    
    1  用户登陆后才能访问某些页面,
    
    2  如果用户没有登录就访问该页面的话直接跳到登录页面
    
    3  用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址
    
    方法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 = 1209600                             # 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 = 1209600                              # 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 = 1209600                                # Session的cookie失效日期(2周)
        SESSION_EXPIRE_AT_BROWSER_CLOSE = False                     # 是否关闭浏览器使得Session过期
        SESSION_SAVE_EVERY_REQUEST = False                          # 是否每次请求都保存Session,默认修改之后才保存

     

  • 相关阅读:
    Server.MapPath()
    如何系统学习网络攻击技术
    查询数据库中有多少表、视图、存储过程
    测试种类
    linq使用Distinct()
    ASPxPivotGrid隐藏列
    Jenkins:Linux下安装部署步骤
    Jenkins:【测试设计】使用jenkins 插件Allure生成漂亮的自动化测试报告
    Python:Python 自动化测试框架 unittest 和 pytest 对比
    Jenkins:插件安装方式及插件下载地址
  • 原文地址:https://www.cnblogs.com/sexiaoshuai/p/7928578.html
Copyright © 2011-2022 走看看