Python之路:Django的ORM映射机制
一、Django请求生命周期
1、Django请求生命周期
Django请求生命周期
-> URL的对应关系(匹配),匹配成功之后
-> 到达视图函数(views.py),执行函数
-> 返回用户字符串
-> 打开一个Html文件,读取内容
2、创建django project
django-admin startproject mysite(程序的名字)
cd mysite
python mange.py startapp xiaomeng(app分支的名字)
3、配置
1、更改访问权限
ALLOWED_HOSTS = ['*']
2、添加模板路径
创建空文件夹static
3、添加静态文件路径
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
4、注释csrf行
把'django.middleware.csrf.CsrfViewMiddleware',注释
# 'django.middleware.csrf.CsrfViewMiddleware',
5、添加两行
SESSION_SAVE_EVERY_REQUEST = True
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
6、设置默认登录页面
LOGIN_URL = '/login/'
4、编写程序
a. urls.py
/index/ -> func
b. views.py
# 包含所有的请求数据
return HttpResponse('字符串')
return render(request, 'index.html', {'特殊数据'})
reruen rediret('URL')
c. 模板语言
return render(request, 'index.html', {'li':[11,22,33]})
{% for item in li %}
<h1>{{item}}</h1>
{% endfor %}
*********** 索引用点 ************
<h1>{{item.2 }}</h1>
二、各个块
1、路由系统,URL
1、一个url对应一个函数或者一个url对应一个类
如:
path('login/', views.login),
path('home/', views.Home.as_view()),
2、一类url对应一个函数或者一类url对应一个类
如:
a、path('detail-<int:nid>.html', views.detail),
def detail(request,nid):
print(nid)
b、path('detail-<int:nid>-<int:uid>.html', views.detail),
def detail(request,nid,uid):
print(request,nid,uid)
或def detail(request, **kwargs):
kwargs = {'nid':3, 'uid':10}
或def detail(request, *args, ** kwargs):
args = ()
kwargs = {'nid':3, 'uid':10}
3、name
对URL路有关系进行命名,以后可以根据此名称生成自己想要的URL
path('indexdadada/<int:n>', views.index, name='index'),
模板语言:
{% url 'index' %} 只跳转到 indexdadada/
{% url 'index' 3 %} path路径中后续参数也能跳转
注:
#当前的URL
request.path_info
4、分类
urlpatterns = [
path('cmdb/', include("app01.urls")),
path('monitor/', include("app02.urls")),
]
app01:
from app01 import views
from django.urls import path
urlpatterns = [
path('login/', views.login),
]
app02:
from app02 import views
from django.urls import path
urlpatterns = [
path('login/', views.login),
]
5、默认值
6、命名空间
2、视图
FBV:函数
def index(request,*args,**kwargs):
...
CBV:类
class Home(views.View):
def get(self,request,*args,**kwargs):
...
获取用户请求中的数据:
request.GET.get 一般代指获取,刷新网页等都是get
request.POST.get 一般代指提交,登录等
request.FILE.get() 代指上传文件
request.path_info 获取当前请求的url
# checkbox等多选的内容
request.POST.getlist()
# 上传文件,form特殊设置:<form action="/login/" method="POST" enctype="multipart/form-data">
obj = request.FILES.get('fafafa')
file_path = os.path.join('upload',obj.name)
f = open(file_path, mode='wb')
for i in obj.chunks():
f.write(i)
f.close()
给用户返回数据:
render(request,'user_info.html',{{ 'k1':v1 }}) 返给用户模板文件的路径
HttpResponse("Hello World") 返给用户字符串
redirect('/cmdb/group_info') 返给用户url路径
3、模板
### views.py
from django.shortcuts import render,HttpResponse
# Create your views here.
def fanhui(request):
return render(request,'fanhui.html',{'k1':123,'k2':[1,2,3,4],'k3':{'name':'lishang','age':18}})
### fanhui.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>
{{ k1 }}
</p>
------------------------------------
<p>
{% for i in k2 %}
{{ i }}
{% endfor %}
</p>
------------------------------------
<p>
{% for row in k3.keys %}
{{ row }}<br>
{% endfor %}
{% for row in k3.values %}
{{ row }}<br>
{% endfor %}
{% for i,row in k3.items %}
{{ i }}-{{ row }}<br>
{% endfor %}
</p>
</body>
</html>
4、ORM操作
创建类和字段
a、先写类
from django.db import models
# app01_userinfo
class UserGroup(models.Model):
uid = models.AutoField(primary_key=True)
caption = models.CharField(max_length=32)
ctime = models.DateTimeField(auto_now_add=True,null=True)
uptime = models.DateTimeField(auto_now=True,null=True)
class UserInfo(models.Model):
# dango 会自动创建id,主键自增
# 创建下面两列,字符串类型,指定长度
id = models.IntegerField()
username = models.CharField(max_length=32)
password = models.CharField(max_length=64) # 字符长度
email = models.EmailField(max_length=20, null=True)
user_group = models.ForeignKey("UserGroup",to_field='uid',default=1,on_delete=models.CASCADE)
b、注册app
setting中加入app01
'shangni01',
]
c、执行命令
执行python manage.py makemigrations
执行python manage.py migrate
d、***********注意***********
Django默认连mysql用MySQLdb模块连接mysql,
改成pymysql,要在project项目下同名文件夹下__init.py__加入如下两行
import pymysql # 导入第三方模块,用来操作mysql数据库
pymysql.install_as_MySQLdb()
1、根据类自动创建数据库表
找到app下的models.py
2、根据类对数据库表中的数据进行各种操作
python manage.py mikemigrations
python manage.py migrate
5、数据库操作 (增删改查)
def orm(request):
# 更新时间
# models.UserGroup.objects.create(caption='lishang')
# obj = models.UserGroup.objects.filter(uid=5).first()
# obj.caption = "xiaomeng"
# obj.save()
# return HttpResponse('orm')
# 三种增加数据的方式
# 方式1:
# models.UserInfo.objects.create(username='root',password='1234',)
# 方式2:
# dict = {'username':'kaixin','password':'shangni'}
# models.UserInfo.objects.create(**dict)
# 方式3:
# obj = models.UserInfo(username='lishang',password='xiaomeng',)
# obj.save()
# 查询全部
# result = models.UserInfo.objects.all()
# # result,QuerySet => Django => []
# a = []
# for i in result:
# select = i.id,i.username,i.password
# a.append(select)
# print(*a,sep='\n')
# return render(request,'select.html',{'select':a})
# 条件查询
# result = models.UserInfo.objects.filter(username='kaixin',password='shangni')
# b = []
# for i in result:
# select1 = i.id,i.username,i.password
# b.append(select1)
# print(*b,sep= '\n')
# return render(request,'select.html',{'select':b})
# 删除
# models.UserInfo.objects.filter(id='4').delete()
# return HttpResponse('已删除')
# 更改
# models.UserInfo.objects.filter(username='kaixin').update(password='ailishang')
# return HttpResponse("已更改")
models.UserInfo.objects.create(
username = 'root111',
password = 'passwd111',
phone_num='05317572530',
email='dada@qq.com',
user_group_id = '2',
)
return HttpResponse('orm')
三、其他
返回按钮返回前一页的三种实现方式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
body{
margin:0
}
#i1{
height:48px;
background-color:cadetblue;
color:aliceblue;
text-align:center;
line-height:48px
}
.menu{
display: block;
padding: 5px;
}
</style>
</head>
<body>
<div id="i1">热烈庆祝台湾回归祖国</div>
<div>
<div style="position: absolute; top: 48px; bottom: 0; left: 0;width: 200px;background-color: lightcoral">
<a class="menu" href="/cmdb/user_info/">用户管理</a>
<a class="menu" href="/cmdb/usergroup/">用户组管理</a>
</div>
</div>
<div style="position: absolute;top: 48px;bottom: 0;left: 205px;right: 0;overflow: auto">
{# 下面三行为方式 1: 在button标签外套一个a标签 #}
{# <a style="display: block" href="/cmdb/user_info/">#}
{# <input type="button" value="返回">#}
{# </a>#}
{# 下面一行为方式 2: 使用onclick事件 #}
{# <button style="position:absolute; top: 2px" onclick="window.location.href = '/cmdb/user_info/' ">返回</button>#}
{# 下面6行为方式 3: 使用JavaScript函数 #}
<input type="button" value="返回" onclick="fanhui()">
<script>
function fanhui() {
window.location.href= "/cmdb/user_info/";
}
</script>
<h1>用户详细信息</h1>
<h5>id :{{ obj.id }}</h5>
<h5>用户名:{{ obj.username }}</h5>
<h5>密 码:{{ obj.password }}</h5>
</div>
</body>
</html >

浙公网安备 33010602011771号