Python篇-Django框架详解(二)
TZ : 只有少女的纯情 是绝对不能背叛的啊
一 : 科普一分钟
有过其他项目基础的同学们都知道数据库项目中的作用,数据也就是项目的核心部分,常常可以用来分析用户的行为和趋势,Django
我们通常把这这种数据操作行为叫做ORM
->Object Relational Mapping->
关系对象映射,在Django
中,根据代码中的类自动生成数据库的表也叫--code first
二 : Django-MTV操作
-
在app内配置对应路由URL
之前我们所写的路由分发文件urls.py
是在Django
文件夹下面所建立编写的,假如多人开发项目会存在不小心更改了他人的路由路径,或者重名导致他人路径失效.所以为了避免类似情况发生,在各自的APP
下分别建立urls.py
文件,而在Django
文件可以进行如下操作,这样操作是程序更佳清爽明朗.
urlpatterns = [
path('admin/', admin.site.urls),
path('myapp/', include("myapp.urls")),
]
在对应的APP
中 文件可以这样设置路由路径
from django.urls import re_path,path
from django.shortcuts import HttpResponse
from django.conf.urls import url,include
from myapp import views
urlpatterns = [
path('login/',views.login),
]
-
CBV和FBV
Function base views
->FBV
用函数来写View
中的逻辑关系
Class base views
- >CBV
用类来写View
中的逻辑关系
View中对应的写法
- 其中
dispatch
为内部调用函数(可以省略)在 get 或者 post 中间触发,可以利用这个函数写一些类似装饰器
的功能
class myHome(View):
def dispatch(self, request, *args, **kwargs):
print('执行前')
retult = super(myHome,self).dispatch(request,*args,**kwargs)
print('执行后')
return retult
# return HttpResponse('OK')
def get(self,request):
print(request.method)
return render(request, '点我.html')
def post(self,request):
return render(request, '点我.html')
- 在url文件中的配置
urlpatterns = [
path('myhome/',views.myHome.as_view()),
]
-
模板文件上传
在网页会出现让我们选择文件然后上传到服务器的操作,web前段如何处理,后台又如何处理,很简单只需要用request.FILES.get
即可拿到 文件对象了
- views 后台处理操作
def login(request):
if request.method == "POST":
obj = request.FILES.get('lalala')
file_path = os.path.join('upload',obj.name)
f = open(file_path,mode="wb")
for i in obj.chunks():
f.write(i)
f.close()
# print(v)
return render(request, 'login.html')
- 前段处理
当设置 为enctype="multipart/form-data"
后台就会处理其文件数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<form action="/login/" method="post" enctype="multipart/form-data" style="background-color: cadetblue">
<p>
<input type="file" name="lalala">
</p>
</form>
</body>
</html>
-
字典在模板中的嵌套
上一篇我们了解到了列表
在模板语言
是如何编写,如何展示的,这一篇来讲解一下字典
在模板语言
中如何显示和编写
- views 中的写法
USER_DICT = {
'1':{'name':'雪芙','age':'24'},
'2':{'name':'子珊','age':'25'},
'3':{'name':'意涵','age':'26'},
'4':{'name':'冰冰','age':'25'},
'5':{'name':'娜扎','age':'24'},
}
def index(request):
return render(request,'index.html',{'user_dict':USER_DICT})
- Templates 中的处理方法
可以分析出来 在循环中k
就是字典的key
,value
就是字典中的value
也就是说再循环中 在前面的就是key
,在后面的就是value
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<form action="{% url 'index' %}" method="post">
<p><input type="text" name="user" placeholder="姓名"></p>
<p><input type="text" name="age" placeholder="年龄"></p>
<input type="submit" value="提交">
</form>
<h6 style="color: deeppink">请选择女仆</h6>
<ul>
{% for k,value in user_dict.items %}
<li><a target="_blank" style="color: deeppink" >{{ value.name }}</a></li>
{% endfor %}
</ul>
</body>
</html>
- 效果图
三 : Django正则表达式
正在表达式的作用:也就是为了让写法格式按照我们要求和期望那样展示给别人或者使用.
为了美观
或者seo
对于某个列表详情通常会把网址设置成 www.TianTianBaby/mygirls/detail-1.html
这种类型的形式 .
- url配置
为什么用re_path
因为在3.0 创建时候创建Django
项目 默认是path
,但是path
不能识别正则.
re_path('detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail),
- Templates 中的处理方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<form action="{% url 'index' %}" method="post">
<p><input type="text" name="user" placeholder="姓名"></p>
<p><input type="text" name="age" placeholder="年龄"></p>
<input type="submit" value="提交">
</form>
<h6 style="color: deeppink">请选择女仆</h6>
<ul>
{% for k,value in user_dict.items %}
<li><a target="_blank" style="color: deeppink" href="/mygirls/detail-{{ k }}-{{ k }}.html">{{ value.name }}</a></li>
{% endfor %}
</ul>
</body>
</html>
四 : Django数据库操作
1. 数据库表编写及创建
- 在
APP
的models.py
文件中我们可以创建用户表
class UserInfo(models.Model):
#id列,自增,主键
#用户名列,字符串类型,指定长度
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)
user_group = models.ForeignKey("UserGroup",on_delete=models.CASCADE,to_field='uid',null=True)
- 执行命令创建
在Terminal中 输入指令,进行创建
python3 manage.py makemigrations
python3 manage.py migrate
到此数据库就算创建成功了
2. 数据库表的增删改查
在Views 定义四个函数分别是增删改查
- 增
def orm(request):
dic = {'username' : '雪芙', 'password' :'12138'}
obj = models.UserInfo(**dic)
obj.save()
return HttpResponse('orm...')
- 删
def ormDelete(request):
models.UserInfo.objects.filter(uid=4).delete()
return HttpResponse('ormDelete...')
- 改
def ormupdate(request):
models.UserInfo.objects.filter(id=3).update(password = '787878')
return HttpResponse('ormUPdata...')
- 查
def ormfind(request):
# 查 result 类型是QuerySet =>Django=>[]
# result = models.UserInfo.objects.all()
result = models.UserInfo.objects.filter(username='baihua')
print(result)
3. 多表外键关联
-
models.py
创建数据表
class UserGroup(models.Model):
uid = models.AutoField(primary_key=True)
caption = models.CharField(max_length=32)
class UserInfo(models.Model):
#id列,自增,主键
#用户名列,字符串类型,指定长度
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)
user_group = models.ForeignKey("UserGroup",on_delete=models.CASCADE,to_field='uid',null=True)
- 同样执行命令更新数据表
python3 manage.py makemigrations
python3 manage.py migrate
其中在UserGroup
表中 为 UserInfo
的外键,在UserInfo
表中自动存放的是 user_group_id
是一个字符串,但是我们在应用的时候 其实是UserGroup
表中的一条实体对象.
比如在UserInfo
查找出来的数据
obj = models.UserInfo.objects.filter(username='baihua').frist()
对 obj
进行操作
obj. user_group
就是UserGroup
结构的一条实体对象.
可以对obj. user_group.caption
进行打印和使用
五 : 总结
Django
的orm
操作本质上会根据对接的数据库引擎,翻译成对应的sql
语句;所有使用Django
开发的项目无需关心程序底层使用的是MySQL
、Oracle
、sqlite
....,如果数据库迁移,只需要更换Django的数据库引擎即可,现在只是基本的数据操作知识,还有更复杂的表结构,和更为奇特的方法值得我们学习和探索.