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')
       
posted @ 2019-08-13 16:48  蜗牛少少  阅读(205)  评论(0编辑  收藏  举报