一、数据库同步
当我们需要使用的数据库中已有的表时,可通过以下方式进行操作:
方式一:
照着数据库表字段手动在models.py书写代码,此方式,数据需要手动二次同步。
方式二:
djangon提供的反响同步,步骤如下:
1.先执行数据库迁移命令,完成连接
python manage.py makemigrations
2.查看代码命令
执行python manage.py inspectdb 命令,将执行后的代码,拷贝到models.py文件中。
二、路由层
1.路由的匹配
1.1 url()方法
url(r‘^test/’,views.func),第一个参数其实就是一个正则表达式,一旦第一个参数匹配到内容就不在进行匹配,直接执行对应的视图函数。
1.2无名分组
url(r‘^test/(\d+)’,views.func),无名分组,将括号内正则表达式匹配的内容当做位置参数传递给后面的视图函数。
1.3有名分组
url(r‘^test/(?P<id>\d+)’,views.func),有名分组,将括号内正则表达式匹配的内容当做关键字参数传递给后面的视图函数。
1.4 注意事项
无名分组和有名分组不能混合使用,但每种分组可以重复使用。
2.反向解析
2.1反向解析步骤
当路由频繁发生变化时,html界面上的连接地址如何做到动态解析:
第一步:给路由与视图函数对应关系添加一个别名(名字自己指定,只要不冲突即可)
url(r‘^index/’,views.index,name = 'index_name')
第二步:根据该别名动态解析出一个结果,该结果可以直接访问到对应的路由
# 前端
<a href="{% url 'index_name' %}">value</a>
# 后端
from django.shortcuts import reverse
reverse(‘index_name’)
# ps: redirect('别名'),redirect也可以直接写别名
2.2无名、有名的反响解析
# 无名反向解析
url(r‘^index/(\d+)’,views.index,name = 'index_name')
# 前端
<a href="{% url 'index_name' 1 %}">value</a> # 只要给个数字即可
# 后端
reverse(‘index_name’,args(1,) # 只要给个数字即可
ps:动态传入数字参数,后面在补充
# 有名反向解析
url(r‘^index/(?P<id>\d+)’,views.index,name = 'index_name')
# 前端
<a href="{% url 'index_name' id=1 %}">value</a> # 只要给个数字即可
# 后端
reverse(‘index_name’,kwargs={'id'=1}) # 只要给个数字即可
ps:动态传入数字参数,后面在补充
另外补充:有名也可以使用无名反向解析的形式
3.路由分发
当一个django项目特别庞大的时候,所有的路由与视图函数映射关系全部卸载总的urls.py文字中就显得太冗余,不便于管理。
django中的每一个应用都可以有自己的urls.py,templates等文件夹,基于上述特点,使用django作分组开发就非常的简便。每个组写自己的应用,最后汇总到一个空的django项目中,然后使用路由分发将多个应用关联到一起。
方式一(复杂版本):
from app1 import urls as app1_urls
from app2 import urls as app2_urls
......
url(r'^app1/',include(app1_urls))
url(r'^app2/',include(app2_urls))
......
方式二(进阶版本):
url(r'^app1/',include('app1.urls'))
url(r'^app2/',include('app2.urls'))
......
4.名称空间
当多个应用在反向解析的时候,如果出现了别名冲突的情况,那么无法自动识别。解决方式如下:
# 方法一:命名空间
# 总路由:
url(r'^app1/',include('app1.urls',namespace='app1'))
url(r'^app2/',include('app2/urls',namespace='app2'))
# 前端
<a herf="{% url 'app1:index_name' %}">app1</a>
<a herf="{% url 'app2:index_name' %}">app2</a>
# 后端
reverse('app1:index_name')
reverse('app2:index_name')
# 方法二:别名不能冲突(加上自己应用名作为前缀)
url(r'^index/',views.indexm,name='app1_index_name')
url(r'^index/',views.indexm,name='app2_index_name')
5.django版本的区别
5.1路由匹配方法
urls.py文件中的路由匹配方法:
1.X版本第一个参数是正则表达式,url(r'^index/',view.func)
2.X和3.X版本第一个参数不支持正则表达式,写什么就是什么,path('index/',view.func)
如果想使用正则,那么2.X和3.X版本也提供了相应的方法re_path(),re_path等价于1.X里面的url方法。
5.2转换器
五种常用转换器
- str,匹配除了路径分隔符(/)之外的非空字符串,这是默认形式;
- int,匹配正整数,包含0;
- slug,匹配字母、数字、横岗、下换线组成的字符串;
- uuid,匹配格式化的uuid;
- path,匹配任何非空字符串,包含了路径分隔符(/),不能用?。
自定义转换器:
class MonthConverter:
regex = '\d{2}' # 属性名必须为regex
def to_python(self,value):
return int(value)
def to_url(self,value):
return value # 匹配的regex是两个数字,返回的结果也必须是两个数字。
三、视图层
1.三板斧的本质
三板斧的本质:通过源码解析,可以发现django视图函数必须返回一个HttpResponse对象。
2.JsonResponse
需求:给前端返回json格式数据
方式1:自己序列化
res = json.dumps(d,ensure_ascii=False)
return HttpResponse(res)
方式2:JsonResponse
from django.http import JsonResponse
def func(request):
d = {'user':'张三','pwd':'12345'}
return JsonResponse(d)
# JsonResponse返回的也是HttpResponse对象。
3.FBV和CBV
FBV:基于函数的视图
CBV:基于类的视图
基本使用:
from django.views import View
class MyView(View):
def get(self,request):
return HttpResponse('get方法')
def post(self,request):
return HttpResponse('post方法')
url(r'^index',views.MyView.as_view())
'''
能够自动根据请求方法的不同执行不同的方法。
'''