1.文件介绍
setting-配置文件
urls -URL和函数的对应关系
manage -管理项目文件(启动项目,创建app,数据管理)
2.创建app
语句:python manage.py startapp app01
文件介绍
admin.py-后台管理【不用】
migration.py-数据库变更【不用】
app.py-项目配置
tests.py-测试【不用】
models.py【重要】对数据库进行操作
views.py【重要】函数
3.注册app
在settings里面找到 INSTALLED_APPS
加入app名。如:‘app01’
4.编写urls和函数的对应关系
(1)找到主文件的urls.py,将urlpatterns里加入path
如:path(‘index/’, views.index),
(2)在上方导入app的views
如:from app01 import views
5.编写视图函数,app的views.py
在上面导入HttpResponse
然后编写函数
如:
def index(request):
return HttpResponse(“welcom!”)
6.启动django项目
(1)python manage.py runserver
(2)pycharm直接启动
7.导入模板文件(两种方法)
在app中进行模板配置
(1)在app中新建文件夹templates并标记,其中保存用到的模板文件
(2)在app内的views.py中编写函数
函数返回一个render(request,“模板文件.html”)
如:
def tem(request):
return render(request,"tem.html")
在项目中进行模板配置
(1)在项目目录中创建templates文件夹并标记(右键选择**‘将目录标记为’**)
(2)在settings中进行注册
'DIRS': [os.path.join(BASE_DIR,"templates")],
8.模板和静态文件
将主文件settings中改为STATIC_URL = ‘/static/’
在app下创建static目录,用来保存静态文件
django推荐使用{% load static %}
链接的href使用href=“{% static ‘…’ %}”
图片的src使用src=“{% static ‘…’ %}”
9.连接数据库(mysql)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'yuanxing',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
10.models 模型
使用ORM技术,对象关系映射,将业务进行了一个解耦合
-Object.save()
-Object.delete()
无需再重复写增删改查
1.数据库没有表,生成数据库中的表
(1)生成迁移
在models中定义一个模型,在终端中输入:
python manage.py makemigrations
(2)执行迁移
在终端中输入,此时才会真正在数据库中生成表:
python manage.py migrate
2.数据库已经建好了,想直接使用
连接数据库后,在终端输入:
python manage.py inspectdb
终端中会生成models代码,复制到models.py中即可
11.对数据库中表的操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Shb3rMX1-1654590240681)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220606162545654.png)]
!!!对对象的操作一定一定要用object!!!
增
def addstudents(request):
student = Studentinformation()
student.wbh= '123456%d' % random.randint(0,100)
student.sname='kovio%d' % random.randint(0,100)
student.save()
return HttpResponse("加入成功!%s,%s"%(student.wbh,student.sname))
可以在models中定义类方法实现添加操作!!!
# models
@classmethod
def create(cls,sname,wbh='123123'):
return cls(sname=sname,wbh=wbh)
#addstudent
student = Studentinformation.objects.create(sname='cj') #注意是对objects进行操作!!!
student.save()
删(通过object找到后删除)
def delete_students(request):
students = Studentinformation.objects.get(sname='kovio17')
students.delete()
return HttpResponse('delete already!')
改(通过object找到后修改)
def update_students(request):
students = Studentinformation.objects.get(wbh=123456)
students.sname='Luci'
students.save()
return HttpResponse('ok!')
查(可以通过object,get和filter/exclude过滤)
def getstudents(request):
students=Studentinformation.objects.filter(sname='kovio5') #只剩下sname='kovio5'
students=Studentinformation.objects.get(sname='kovio5') #只找sname='kovio5'
students=Studentinformation.objects.exclude(sname='kovio5') #除了sname='kovio5'的都留下
students = Studentinformation.objects.all().order_by('wbh') #按wbh排序
context={
"students":students
}
return render(request,'index.html',context=context)
students_values = Studentinformation.objects.values() #将数据返回成类似json格式
print(students_values)
get获取单个对象时要注意
1.找不到要查找的值,会报异常,DoesNotExist
2.表中有多个相等的值,会报异常,MultipulObjectReturned
用查找方法写登录逻辑
def get_user(request):
sname = "cj"
wbh='123123'
users = Studentinformation.objects.filter(sname = sname)
print(users.count()) #玄学,不加这一句会卡住,不会报登录是否成功
if users.count():
user = users.first()
if user.wbh == wbh:
print('成功登录')
else:
print('wbh错误')
else:
print('无此用户')
return HttpResponse('get!')
对结果集QuerrySet进行切片操作,相当在数据库里面的limit
在分页显示等场景很好用
-
和python里面的切片不太一样,下标不能为负
-
QuerySet[5:15]获取第五条数据到第十四条数据
相当于SQL中limit和offset
查询条件
- 属性_运算符=值
- gt
- lt
- gte
- lte
- in在某一集合中
- contains类似于模糊查询like
- startswith 以x×开始本质也是liKe
- endswith 以xx结束也是like
- exact
- 前面同时添加i , ignore忽略
- iexact
- icontains
- istartswith
- iendswith
一对多关系
一个班级有多个学生,一个学生属于一个班级。
查找学生是哪个班级:
student = Student.objects.get(class=***)
class = students.class
查找某个班级有哪些学生:
class = Class.objects.get(class=***)
students = class.student_set.all()
student_set获取的是一个集合,正常来说应该在数据库里面
select * from studnts where class = ***
但是在这里直接通过class本身找到了所有包含此班级的学生。
12.配置路由url
url是Django 1.x中的写法,在Django2.1中,开始舍弃Django1.x中的url写法。
在Django2.x中,描写url配置的有两个函数path和re_path
re_path()函数可以看做是django 1.x中得url函数,即可以在路径中使用正则。
新版本路由配置规则
总路由
from django.conf.urls import url, include
from django.urls import path, re_path
from login import views
urlpatterns = [
url(r'^login/', include("login.urls")),#总路由包含分路由
path(r'^enroll/', views.enroll),#或者直接连接分路由
# re_path(r'^$',views.login),
]
# urlpatterns是一个列表!!
分路由
from django.conf.urls import url
from login import views
urlpatterns=[
url('index/', views.login),
url('addstudent/',views.addstudents),
url('getstudent/',views.getstudents),
url('update_student/',views.update_students),
]
路由结构:总路由+分路由
13.(高级)对model中的表编写类方法实现数据的增删改查
方法
·对象方法
可以调用对象的属性,也可以调用类的属性
·类方法
不能调用对象属性,只能调用类属性
·静态方法
啥都不能调用,不能获取对象属性,也不能获取类属性。只是寄生在我们这个类上而已
快捷键
-control + P 参数提示
-shift + f6 重命名,重构
-alt + enter 自动导包
状态码
-
2xx
请求成功
-
3xx
转发或重定向
-
4xx
客户端错误
-
5xx
1.服务器错了
2.后端开发人员的锅
13.(高级)对model中的表编写类方法实现数据的增删改查
方法
·对象方法
可以调用对象的属性,也可以调用类的属性
·类方法
不能调用对象属性,只能调用类属性
·静态方法
啥都不能调用,不能获取对象属性,也不能获取类属性。只是寄生在我们这个类上而已
快捷键
-control + P 参数提示
-shift + f6 重命名,重构
-alt + enter 自动导包
状态码
-
2xx
请求成功
-
3xx
转发或重定向
-
4xx
客户端错误
-
5xx
1.服务器错了
2.后端开发人员的锅