• Django的进阶1


    day58

    昨天的内容:

    1. 对老师表的操作:

      增删改查:

      -新URL

      -ajax的方式

    2. 前台给后台一个列表话,后台接受:

      getlist()

      ajax传递列表的时候,加一个参数:

      traditional:true;

    3. cookie和session:

      主要用来进行登录使用

     

    key:key值

    value:value值

    max_age:超时时间,单位S (秒)

    expires:超时时间,单位day (天)

    path:/ 代表全站生效 /users/:代表访问/users/的时候,才会生效

    domain:同上

    secure:http/https

    httponly:True->js不能获取网站的cookie;

    False ->js可以获取网站的cookie;

    set_signed_cookie(key,val,salt)加密

    今天内容:

    a.路由系统

    1. 创建APP

      创建app:

      a.使用pycharm创建django的时候,加上app的名

      b.python manage.py startapp app的名字

      路由的分组:

      a.将业务逻辑写入到app的views

      urls.py:

      from app01 import views:

      urlpatterns = [

      #url(r'^admin/',admin.site.urls),

      url(f'^test/‘,views.test)

      ]

      缺陷,只能有1个 ,因为上面的会被覆盖

      b.使用include进行app分组

      urls.py:

      from django.conf.urls import url,include

      urlpatterms = [

      url(r'^classes/',include("classes.urls"))

      url(r'^teachers/',include("teachers.urls"))

      url(r'^students/',include("students.urls"))

      ]

      在其他的APP中添加urls文件,以classes为例

      from django.conf.urls import url

      from classes import views

      urlpatterns = [

      url(r'^get_classes/',views.get_classes)

      ]

      在app的view中添加业务逻辑处理函数,以classes为例

      from django.shortcuts import render,Httpresponse

      def get_classes(request):

      return HttpResponse('classes list')

    1. 路由的分发

      -正则表达式匹配

      urlrouters:
        url(r'^test/(w+)/(w+)/',views.test)
        url(r'^test1/(?P<id>w+)/(?p<name>w+)',wiews.test)
         #匹配的时候不管id位置都会把匹配到的ID值赋给id

             
      view.py:
             def test(request,name,id):
            print(id,name)
            return HttpResponse('test')
             
             def test1(request,name,id):
            print(id,name)
            return HttpResponse('test')
             
         
      #注意
      #如果没有?P的约束,传参的时候,会根据顺序来获取参数对应的值
      #而如果有约束的话,传参的时候,会固定的将获取的值传给对应的约束

      #自定制404 notfound页面
      url(r'^',views.notfound),

      views:
         def notfound(request):
             return render(request,"404.html")
         
         
         
      #反向路由解析:
      urls.py:
         url(r'^xnjklskladhsdksada/$',views.login,name='XXX'),
         
      login.html:
         <form action="{% url "XXX" %}" method="post">
        <input type="text">
         </form>


      - FBV(function based views)
      使用函数来处理业务逻辑
         
      -CBV(class based views)
      使用类来处理业务逻辑
         
         urls.py:
             url(r'^login/',views.login.as_view()),
             
         views.py:
             from django.views import View
             cla0ss Login(view):
                 def get(self,request):
                     
                     return render(request,'login.html')
                 
                 def post(self,request):
                     pass
                 
         """
        当请求过来的时候,会有先判断你的请求方法是get还是post,如果是get请求的话,走get函数,反之,走POST函数
         
        http的请求方法:
        get:获取信息
        post:提交数据用POST
        put:跟新数据
        patch:部分更新
        delete:删除
         
        form表单的方式:只支持get/post方法
        ajax的方式:全部都支持
        type:POST、get、delete
         
         
         
        """
                     
                     
                     

    b.django的ORM模型(model).

    1. 创建的模型( model)的步骤

    a. 需要创建一个数据库
    b. settings中配置连接:
      DATABASES = {
         # 'default': {
         #     'ENGINE': 'django.db.backends.sqlite3', ### 非常小型的文件数据库
         #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
         # }

         'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'test',  ## 数据库名称
            'USER': 'root',
            'PASSWORD': '',  ## 安装 mysql 数据库时,输入的 root 用户的密码
            'HOST': '127.0.0.1',
        }
      }

    c. 在对应的app中的__init__文件下面:
      import pymysql
      pymysql.install_as_MySQLdb()

    d. INSTALLED_APPS = [
         'django.contrib.admin',
         'django.contrib.auth',
         'django.contrib.contenttypes',
         'django.contrib.sessions',
         'django.contrib.messages',
         'django.contrib.staticfiles',
         'app01',
         'classes'
      ]
    #创建表
    from django.db import models

    # create your models here
    # 一个类对应一个表

    class UserType(models.Model):
       # 不写id这一行代码的时候,会自动增加id自增这一列
       title = models.CharField(max_length=32,null=True)

    class UserInfo(models.Model):
       id = models.AutoField(primary_key=True)
       name = models.CharField(max_length=32,null=True)
       age = models.CharField(max_length=32,null=True)
       
       #更改任何一行代码,你都必须重新执行,否则不生效!
       #一对多
       ut = models.ForeignKey("UserType")
       #默认是关联到UserType下面的id字段
       #to:关联表,to_field:关联的字段
       #将类转为实际的表:
      python manage.py makemigrations  #生成迁移文件
           python manage.py migrate #生成实际的表

       
       

    ** 打散

    ORM的基本的增删改查

    #对数据的增删改查 **对不确定的数据一定要先打印出来,在进行操作
    from app01 import models
    def ormtest(request):
       #单表的查询 1.
       res = models.UserInfo.object.all()
       #queryset中包含对象
       print(res)  # <QuerySet [<UserInfo: UserInfo object>, <UserInfo: UserInfo object>]> 列表里面对象
       for obj in res:
           print(obj.username,obj.age,obj.ut)
           
       #2.values
       res = models.UserInfo.object.values("username",'age')
       print(res) # <QuerySet [{'username': 'zekai', 'age': '18'}, {'username': 'chunge', 'age': '23'}]> 列表里面字典
       
       #3.values_list
       res = models.UserInfo.objects.values_list("username","age")
       print(res) # <QuerySet [('zekai', '18'), s('chunge', '23'), ('eagon', '33')]> 列表里面元祖
       
       res= models.UserInfo.object.first()
       print(res.username) #UserInfo Object
       #神奇的双下划綫 __
       res= models.UserInfo.objects.filter(id__gt=3)  #等同于where id >3
       print(res) # <QuerySet [<UserInfo: UserInfo object>]>

       
       #增加
       #1.
       models.UserInfo.onjects.create(username='kkk',age='12',ut_id=3)
       
       #2.
       UserInfo = {"username":'ddd','age':23,'ut_id':3}
       models.UserInfo.objects.create(**userInfo)
       
       #删除
       models.UserInfo.objects.filter(id=3).delete()
       
       #更新
       models.UserInfo.objects.filter(id=3).update(username='egon222')
       
       #一对多连表操作
       #正向查询
       #获取某一个用户所对应的用户类型
       res = models.UserInfo.objects.all()
       for obj in res:
           print(obj.username,obj.age,obj.ut.title)

           
       #神奇的双下滑线__
       res = models.UserInfo.objects.values('username','age','ut__title')
       print(res)
       
       res = models.UserINfo.objects.values_list('username','age','ut__title')
       print(res)

       
       
       #反向查询
       #获取所有类型下面的用户
       res = models.UserType.objects.all()
       #表名小写_set
       for obj in res:
           print(obj.id,obj.title,obj.userinfo_set.all())
           #obj.userinfo.set.all() 相当于models.UserInfo.objects.filter(ut__id=1).all()
           
           
       #使用表名小写__字段名
       res= models.UserType.objects.values('title','userinfo__id','userinfo__age','userinfo__username')
           
  • 相关阅读:
    Flowplayer-Subtitle
    Flowplayer-playlist
    Flowplayer-Embedding
    Flowplayer-Skin
    Flowplayer-Setup
    Flowplayer-JavaScript API
    任务监控程序设计与实现总结
    Spark RDD整理
    oracle连接和执行流程总结
    阅读《Oracle内核技术揭秘》的读书笔记
  • 原文地址:https://www.cnblogs.com/zrx19960128/p/11346869.html
Copyright © 2020-2023  润新知