上周内容回顾
# 1.对象映射关系
类 》表
对象 》记录
属性 》字段值
# 2.如何来使用
class User(models.Model):
# id int primary key auto_increment
id = models.AutoField(primary_key=True) # 如果表的主键名就是ID 则可以省略
username = models.CharField(max_length=32, default=0, null-True) # not null
# 3.数据的增删改查
# 增
# request.POST => {'A':1, 'B':2, 'C':3}
models.User.objects.create(username='ly', password=123)
models.User.objects.create(**A)
obj = models.User(username=123)
obj.save()
# 改
models.User.objects.filter().update(username=123)
obj = models.User.objects.filter(pk=1).first() # 对象,不是queryset
obj.username = 'aaa'
obj.password = 'bbb'
obj.save()
# 删
filter().delete()
# 查
# filter里面的条件是and关系
obj = models.User.objects.filter()
obj = models.User.objects.filter().filter().all() # 返回的结果是queryset对象
"""因为 返回结果是queryset 就可以继续使用queryset提供的点方法"""
# 4.ORM创建外键关系
01 一对一关系 外键字段建在使用频率高的一方
models.OneToOneField(to='AuthorDetail', to_field='')
02 一对多 外键字段建在多的一方
models.ForeignKey(to='')
03 多对多 外键建在第三张表 不需要我们手动创建
authors = models.ManyToManyField(to='')
今日内容概要
- Django 的请求生命周期流程图
- 路由层
- 路由分发
- 名称空间
- 虚拟环境演示
内容详细
1. Django的请求生周期流程图
# 帮助我们梳理django框架的执行顺序
![image]()
2. 路由层
# 路由匹配 urls.py中
# 在Django1.x中 创建新的项目后 先在配置文件settings中修改配置 再去启动项目:
"""
TEMPLATES = [
{
'DIRS': [os.path.join(BASE_DIR, 'templates')]
"""
# url属性中是正则匹配 匹配规则:从上到下只要正则表达式匹配成功,就不会往下匹配了
# 在urls.py文件中写入:
"""
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', views.test), # 客户输入默认域名 就是访问首页
url(r'^test/$', views.test),
url(r'^testadd/$', views.testadd),
]
"""
# 在app目录下的views.py文件中写入:
"""
from django.shortcuts import render, HttpResponse
# Create your views here.
def test(request):
print('test')
return HttpResponse('test')
def testadd(request):
print('testadd')
return HttpResponse('testadd')
"""
# 补充
对于Django自动补全/功能 如果不想要 也可以在settings.py文件中增加配置项:
APPEND_SLASH = False # 控制django是否自动加斜杠匹配
get请求的传参方式:
http://127.0.0.1:8000/test/?a=1
http://127.0.0.1:8000/test/1
![image]()
![image]()
3. 无名分组和有名分组
# 无名分组
# 在urls.py文件中写入:
# 无名分组
url(r'^test/(\d+)', views.test), # 会把括号中匹配的数字当成 位置参数传给视图函数
# 在app目录下的views.py文件中写入:
"""
from django.shortcuts import render, HttpResponse
# Create your views here.
def test(request, aaa):
print(aaa)
print('test')
return HttpResponse('test')
"""
# 有名分组
# 在urls.py文件中写入:
# 有名分组
url(r'^test/(?P<bbb>\d+)$', views.test), # 会把括号中匹配的数字当成 关键字参数传给视图函数
# 在app目录下的views.py文件中写入:
"""
from django.shortcuts import render, HttpResponse
# Create your views here.
def test(request, bbb):
print(bbb)
print('test')
return HttpResponse('test')
"""
![image]()
![image]()
4. 反向解析
# 反向解析其实就是:
通过一个路由别名 可以得到别名所在的这行路由的 完整地址
路由是可以起别名的
'''以下都是直接访问原始域名:127.0.0.1:8000'''
# 1.后端反向解析
# 在urls.py文件中写入:
"""
url(r'^$', views.home), # 客户输入默认域名 就是访问首页
url(r'^v1/v2/v3/v4/v5/test/', views.test, name='test'),
"""
# 在app目录下的views.py文件中写入:
"""
from django.shortcuts import HttpResponse, reverse
# Create your views here.
def home(request):
# 后端反向解析
print(reverse('test'))
return HttpResponse('home')
"""
# 2.前端反向解析
# 在urls.py文件中写入:
"""
url(r'^$', views.home), # 客户输入默认域名 就是访问首页
url(r'^test', views.test, name='test'),
"""
# 在app目录下的views.py文件中写入:
"""
from django.shortcuts import render, HttpResponse, reverse
# Create your views here.
def home(request):
# 前端反向解析
print(reverse('test'))
return render(request, 'home.html')
"""
# 新建home.HTML文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<a href="{% url 'test' %}">反向解析</a>
</body>
</html>
# 3.后端无名带参数的反向解析
# 在urls.py文件中写入:
"""
url(r'^$', views.home), # 客户输入默认域名 就是访问首页
url(r'^test/(\d+)', views.test, name='test'),
"""
# 在app目录下的views.py文件中写入
"""
from django.shortcuts import render, HttpResponse, reverse
# Create your views here.
def home(request):
# 后端反向解析
print(reverse('test', args=(111, )))
return HttpResponse('home')
"""
# 4.后端有名带参数的反向解析
# 在urls.py文件中写入:
"""
url(r'^$', views.home), # 客户输入默认域名 就是访问首页
url(r'^test/(?P<aaa>\d+)', views.test, name='test'),
"""
# 在app目录下的views.py文件中写入
"""
from django.shortcuts import render, HttpResponse, reverse
# Create your views here.
def home(request):
# 后端反向解析
print(reverse('test', kwargs={'aaa': 1111}))
return HttpResponse('home')
"""
# 5.前端无名带参数的反向解析
# 在urls.py文件中写入:
"""
url(r'^$', views.home), # 客户输入默认域名 就是访问首页
url(r'^test/(\d+)', views.test, name='test'),
"""
# 在app目录下的views.py文件中写入
"""
from django.shortcuts import render, HttpResponse, reverse
# Create your views here.
def home(request):
# 前端反向解析
return render(request, 'home.html')
"""
# home.HTML文件:
"""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<a href="{% url 'test' 111 %}">反向解析</a>
</body>
</html>
"""
# 6.前端有名带参数的反向解析
# 在urls.py文件中写入:
"""
url(r'^$', views.home), # 客户输入默认域名 就是访问首页
url(r'^test/(?P<aaa>\d+)', views.test, name='test'),
"""
# 在app目录下的views.py文件中写入
"""
from django.shortcuts import render, HttpResponse, reverse
# Create your views here.
def home(request):
# 前端反向解析
print(reverse('test', kwargs={'aaa': 111}))
return render(request, 'home.html')
"""
# home.HTML文件:
"""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<a href="{% url 'test' aaa=111 %}">反向解析</a>
</body>
</html>
"""
![image]()
![image]()
5. 路由分发
# 重点
以后我们的django项目会越来越大,那么就会导致总路由文件会越来越大,就会非常难维护,我们会把总路由分开到不同的应用下面
'''
django的每一个应用都支持有自己的对应配置:
urls.py
templates
static
'''
# 使用路由分发一般都是多个应用
1.先再创建一个应用
startapp app02
创建完成后记得到settings.py中配置
2.将 urls.py文件复制一份到app01、app02目录下
# 实现路由分发方式一:
# 访问:127.0.0.1:8000/app01/index/
# 访问:127.0.0.1:8000/app02/index/
1.总路由 urls.py中写入:
"""
from django.conf.urls import url
from django.contrib import admin
from app01 import views
from django.conf.urls import include
from app01 import urls as app01_urls
from app02 import urls as app02_urls
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', views.home), # 客户输入默认域名 就是访问首页
url(r'^app01/', include(app01_urls)),
url(r'^app02/', include(app02_urls))
]
"""
2.app01 urls.py文件中写入:
"""
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^index', views.index),
]
"""
3.app02 urls.py文件中写入:
"""
from django.conf.urls import url
from app02 import views
urlpatterns = [
url(r'^index', views.index),
]
"""
4.app01 views.py文件中写入:
"""
from django.shortcuts import HttpResponse
# Create your views here.
def index(request):
return HttpResponse('app01:index')
"""
5.app02 views.py文件中写入:
"""
from django.shortcuts import HttpResponse
# Create your views here.
def index(request):
return HttpResponse('app02:index')
"""
# 实现路由分发方式二:
在总路由 urls.py中写入:
"""
from django.conf.urls import url
from django.contrib import admin
from app01 import views
from django.conf.urls import include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', views.home), # 客户输入默认域名 就是访问首页
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls'))
]
"""
![image]()
![image]()
6. 名称空间
# 当多个应用出现相同的别名时,反向解析就没办法识别了
1.在总路由urls.py文件中:
"""
from django.conf.urls import url
from django.contrib import admin
from app01 import views
from django.conf.urls import include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', views.home), # 客户输入默认域名 就是访问首页
url(r'^app01/', include('app01.urls', namespace='app01')),
url(r'^app02/', include('app02.urls', namespace='app02'))
]
"""
2.在app01的urls.py文件中:
"""
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^index', views.index, name='app01_index'),
url(r'^home', views.home, name='index'),
]
"""
3.在app01的views.py文件中:
"""
from django.shortcuts import render, HttpResponse, reverse
# Create your views here.
def index(request):
return HttpResponse('app01:index')
def home(request):
print(reverse('app01:app01_index'))
print(reverse('app02:app02_index'))
return HttpResponse('home')
"""
4.在app02的urls.py文件中:
"""
from django.conf.urls import url
from app02 import views
urlpatterns = [
url(r'^index', views.index, name='app02_index'),
]
"""
5.在app02的views.py文件中:
"""
from django.shortcuts import HttpResponse
# Create your views here.
def index(request):
return HttpResponse('app02:index')
"""
![image]()
7. 虚拟环境
# 针对不同的项目,创建出来一个新的python环境,类似于是一个新的python解释器
![image]()
![image]()