zoukankan      html  css  js  c++  java
  • day-61Django

    路由系统

    伪静态案例:
      https://www.cnblogs.com/linhaifeng/articles/    7133167(id)   +     .html

    使用伪静态的原因:

      a. 美观
      b. seo (搜索引擎优化技术,研究各大搜索引擎的收录规则):
        设置方法:
          1.html中的met标签a: name=keyword    value=“xxx,培训” (value后面的会收录到搜索引擎的数据库)
          2.优化url,因为搜索引擎偏好静态网站,所以设置伪静态

    根据第二种设置方法,Django如何实现

    路由分发:

    html: http://127.0.0.1:8000/up_studnet/12/

    url:
      url(r'^index/(w+)/(w+)/', index),            ()是分组,这种事位置传参
      url(r'^test/(?P<id>w+)/(?P<name>w+)/', test),    这种 取别名传参

    函数:

      def test(request, name, id):
        print(id , name)

        return HttpResponse('test')

    路由正则:

      url(r'^test2/$', test2)             以什么开头以什么结尾(就找test2/)

      url(r'^', notfound)                自定义404 not found( 需要写到最下面)

     反向路由:

    后台url:
      url(r'^logindjsajdbjsabdsabdbsabdhsabdhbsahbdsaasa/$', login, name='xxx')
    前台:
      <form action="{%  url  'xxx'  %}">
        <input type="text">
      </form>

     django创建app:

      python3 manage.py startapp 自定义app名称(文件夹)

    app01下面文件:
      admin.py :     写和django-admin相关的配置
      apps:       对app01的配置
      models:      数据表模型 
      tests:       测试
      views:        视图函数 

    路由分组(火箭分离):
      总urls.py;
        url(r'^app02/', include('app02.urls')),
        url(r'^app03/', include('app03.urls')),

        分appurls.py:
          from app03 import views

          urlpatterns = [

            url(r'^students/', views.studnets)
          ]

    函数视图

      FBV(在views写的逻辑全是函数)


      CBV(用类去写):

        app01:

          urls.py:
            url(r'^login/', views.Login.as_view()),


          views.py:
            from django.views import View


            class Login(View):

              def get(self, request):           GET请求走这个

                return render(request, "login.html")

              def post(self, request):           POST请求走这个
                uname = request.POST.get('username')

                return HttpResponse('ok')



    http请求的一些方法:
        'get':        请求数据
        'post':      提交数据
        'delete':    删除(这个)数据
        'put':   更新(这个)数据
        'patch':    更新部分数据

      注意:
        form表单提交 只支持get、post
        ajax全部支持

    view这个类的底层原理:
      dispatch方法通过字符串的反射来获得对应的方法

    案例:
      def dispatch(self, request, *args, **kwargs):
        super(Login, self).dispatch(request, *args, **kwargs)
        下面可以自定制预处理操作,比如 通过request,来进行权限管理

    ORM(用pymysql连接数据库)

    1.配置ORM(settings文件中完成):

      a.创建数据库

      b.配置mysql链接数据库:
        DATABASES = {
            # 'default': {
            # 'ENGINE': 'django.db.backends.sqlite3',              sqlite3(小型文件数据库)Django默认的数据库
            # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
          # }
          'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 's8day61',            ## 数据库名称
            'USER': 'root',
            'PASSWORD': '123',         ## 输入的 root 用户的密码
            'HOST': '127.0.0.1',
          }
         }

      c. 注册app:
        INSTALLED_APPS = [
          'django.contrib.admin',
          'django.contrib.auth',
          'django.contrib.contenttypes',
          'django.contrib.sessions',
          'django.contrib.messages',
          'django.contrib.staticfiles',
          'app02',
          'app03'                注册 创建好的全部qpp,如果不注册,models模型无法生成相对应的表
        ]

      d. 需要将mysqldb换成pymysql
        python3:
          pymysql

        python2:
          MySQLdb(Django默认的连接方法)



        每个app下的 __init__.py文件
          import pymysql
          pymysql.install_as_MySQLdb()

    2.ORM创建表

    一对多:

    class Department(models.Model):
                                                    #id这一列可以不写
        title = models.CharField(max_length=32,  null=True)
    
    class UserInfo(models.Model):
        id = models.AutoField(int类型)(primary_key=True)
        uname = models.CharField(max_length=32, null=True)
        age = models.CharField(max_length=32, null=True)
        email = models.CharField(max_length=32, default="")
        ud = models.ForeignKey("Department", null=True)  #与Department创建外键关系, 生成的外键名是ud_id
    
    

    创建表 命令:

      python3 manage.py makemigrations


      执行完成后,在当前app的migrations文件夹下创建一个0001_initial文件,里面有要创建表名和列
      
      python3 manage.py migrate


      根据上面的文件生成表(默认表名是  app_表名)


    表的改:

      如果已经建好表,还要再models添加列,重复上面操作(也就是在生成一个0001_initial文件,里面只有需要加列的代码)


      如果改列明直接在models改,然后重复上面操作,中间选y

    遇到的问题:

      email = models.CharField(max_length=32)
      如果后面不加

        选1,后面跟email的默认值
        选2,退出,自己在models代码填写
          a)   null=True
          b)   default=""

    3.ORM对数据库的操作:

    def test(request):
        from app03 import  models
    
        =====================单表 的增删改查======================
        
        #增加:
        # models.Department.objects.create(title="保安部")         增加一行数据,列名="xxx"
     
    
        # 查询:
        
        #1.查询所有( 返回列表套对象( 一行一行数据当做一个个对象返回))        
       
        
        # res = models.Department.objects.all()
        # <QuerySet [<Department: Department object>, <Department: Department object>]>
        # for row in res:
        #     print(row.id, row.title)
        
    
        #2.指定查哪些列( 返回列表套字典)
        #select title from department ;
        # res = models.Department.objects.values("title").all()
        # ### <QuerySet [{'title': '保安部'}, {'title': '开发部'}, {'title': '开发部'}]>
        # for row in res:
        #     print(row['title'])
        
    
        #2指定查哪些列(返回列表套元祖) 
        # res = models.Department.objects.values_list("title").all()
        # ### <QuerySet [('保安部',), ('开发部',), ('开发部',)]>
    
        
        #限制条件查(返回列表套对象)
        #select * from xxx where title = "开发部"
        # res = models.Department.objects.filter(title='开发部').all()
    
    
        # res = models.Department.objects.filter(id__lt = 3)       id<3
        # res = models.Department.objects.filter(id__lt = 3)       id<=3
         
        # res = models.Department.objects.filter(id__gt = 3)        id>3
        
        #取查询所有的第一条数据(直接返对象,没有列表回一个)
        # res = models.Department.objects.all().first()
      
        
    
        #删:
        # models.Department.objects.filter(id=3).delete()
    
        #更新
        # models.Department.objects.filter(id=2).update(title='xxxx')
    
    
    
    
        =====================一对多 的增删改查======================
        #增(第一种):
        
        # models.UserInfo.objects.create(uname = "zekai3", age=15, email="dddd@qq.com", ud_id=2)
        # models.UserInfo.objects.create(uname = "zekai4", age=16, email="gggg@qq.com", ud_id=2)
        # models.UserInfo.objects.create(uname = "zekai5", age=18, email="hhhh@qq.com", ud_id=1)
    
        #增(第二种):
        # info = {"uname":'zekai2', 'age':13, "email":'123@qq.com', "ud_id":2}
        # models.UserInfo.objects.create(**info)
    
    
        #查询:
        
        #正向查询(返回列表套对象)
         
        # res = models.UserInfo.objects.all()
        # for row in res:
        #     print(row.id, row.uname, row.age, row.ud.title)
        
        1.ud这个外键,代表着关联对方的每一条数据
            返回的是UserInfo表中每一行的ud_id对应的Department中的xxx
        2.ud后面跟外键表名,后面还可以跟外键的外键表名,也就是链式查询
    
        #反向查询(返回的是列表套对象)
        # res = models.Department.objects.all()
        # for row in  res:
        #     print(row.title, row.userinfo_set.all())              后面还可以跟.first()等等、、、
        
        1.写法: 小写的表名_set.all()
        2.将Department表中每一条数据对应的UserInfo的数据返回
              
        
        #删:
        # models.Department.objects.filter(id=3).delete()
    
        #更新
        # models.Department.objects.filter(id=2).update(title='xxxx')
    
    
        =============================双下划线==============================
    
        #神奇的双下画线
        
        当使用values查询时,返回的不是对象,
        而ud__title返回的是ud外键表中title列中所有数据(正向查询)
        res = models.UserInfo.objects.values('id', 'uname', "ud__title").all()
        print(res)
    
        反向查询同上
        res = models.UserInfo.objects.values_list('id', 'uname', "ud__title").all()
        print(res)
    
    
    
        return HttpResponse('ok')
  • 相关阅读:
    22.抽象类
    21.多态
    20.修饰符
    19.继承
    day46---MySQL数据库进阶(一)
    day45---mysql数据库基本操作初阶(二)
    day45---计算机安全项目(癞蛤蟆)
    day44---数据库初阶(一)
    day44---windows下安装MySQL-5.6.37
    day42---几种network IO模型
  • 原文地址:https://www.cnblogs.com/klw1/p/11190384.html
Copyright © 2011-2022 走看看