昨天的内容:
-
对老师表的操作:
增删改查:
-新URL
-ajax的方式
-
前台给后台一个列表话,后台接受:
ajax传递列表的时候,加一个参数:
traditional:true;
-
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.路由系统
-
创建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')
-
路由的分发
-正则表达式匹配
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).
-
创建的模型( 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=