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 >
posted @ 2022-02-18 17:36  中國颜值的半壁江山  阅读(48)  评论(0)    收藏  举报