通过上节课的学习,我们已经对Django有了简单的了解,现在来深入了解下~
1.1 单一路由对应
|
1
|
url(r'^index$', views.index),
|
1.2 基于正则的路由
|
1
2
|
url(r'^index/(\d*)', views.index),
url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),
|
- 找到urls.py文件,修改路由规则
|
1
2
3
4
5
6
7
8
|
from django.conf.urls import url,include
from django.contrib import admin
from cmdb import views
urlpatterns = [
url(r'^index', views.index),
url(r'^detail-(\d+).html/', views.detail),
] |
- 在views.py文件创建对应方法
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
USER_DICT = {
'1':{'name':'root1','email':'root@live.com'},
'2':{'name':'root2','email':'root@live.com'},
'3':{'name':'root3','email':'root@live.com'},
'4':{'name':'root4','email':'root@live.com'},
} def index(request):
return render(request,"index.html",{"user_dict":USER_DICT})
def detail(request,nid): # nid指定的是(\d+)里的内容
detail_info = USER_DICT[nid]
return render(request, "detail.html", {"detail_info": detail_info})
|
1.3 url分组
在url.py增加对应路径
|
1
2
3
4
5
6
7
8
|
from django.conf.urls import url,include
from django.contrib import admin
from cmdb import views
urlpatterns = [
url(r'^index', views.index),
url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html/', views.detail),<br> # nid=\d+ uid=\d+
] |
在views.py文件创建对应方法
|
1
2
3
4
5
6
|
def detail(request,**kwargs):
print(kwargs)
#{'nid': '4', 'uid': '3'}
nid = kwargs.get("nid")
detail_info = USER_DICT[nid]
return render(request, "detail.html", {"detail_info": detail_info})
|
1.4 为路由映射名称
|
1
2
3
4
5
6
7
8
9
|
from django.conf.urls import url,include
from django.contrib import admin
from cmdb import views
urlpatterns = [
url(r'^asdfasdfasdf/', views.index, name='i1'), #第一种方式i1
url(r'^yug/(\d+)/(\d+)/', views.index, name='i2'), #第二种方式i2
url(r'^buy/(?P<pid>\d+)/(?P<nid>\d+)/', views.index, name='i3'), #第三种方式i3
] |
在templates目录下的index.html
|
1
2
3
4
5
6
7
8
9
10
11
12
|
<body>{#第一种方法i1 路径asdfasdfasdf/#}
{#<form action="{% url "i1" %}" method="post">#}
{#第二种方法i2 路径yug/1/2/#}
{#<form action="{% url "i2" 1 2 %}" method="post">#}
{#第三种方法i3 路径buy/1/9//#}
<form action="{% url "i3" pid=1 nid=9 %}" method="post">
<p><input name="user" type="text" placeholder="用户名"/></p>
<p><input name="password" type="password" placeholder="密码"/></p>
<p><input type="submit" value="提交"/></p>
</form>
</body>
|
1.5 根据app对路由分类
主程序urls.py文件
|
1
2
3
4
5
6
|
from django.conf.urls import url,include
from django.contrib import admin
urlpatterns = [
url(r'^monitor/', include('monitor.urls')), #调整到monitor目录中的urls.py文件
] |
cmdb下的url.py文件
|
1
2
3
4
5
6
7
|
from django.conf.urls import url
from django.contrib import admin
from monitor import views
#urlpatterns = [
url(r'^login', views.login),
] |
1.6 获取当前URL
view.py中配置
|
1
2
3
4
|
def index(request):
print(request.path_info) #获取客户端当前的访问链接
# / index
return render(request,"index.html",{"user_dict":USER_DICT})
|
在templates目录下的index.html文件
|
1
2
3
4
5
|
<form action="{{ request.path_info }}" method="post">
<p><input name="user" type="text" placeholder="用户名"/></p>
<p><input name="password" type="password" placeholder="密码"/></p>
<p><input type="submit" value="提交"/></p>
</form>
|
2. 视图
2.1 获取用户请求数据
request.GET
request.POST
request.FILES
其中,GET一般用于获取/查询 资源信息,而POST一般用于更新 资源信息 ; FILES用来获取上传文件;
2.2 checkbox等多选的内容
在templates目录下创建login.html
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login" method="POST" >
<p>
男:<input type="checkbox" name="favor" value="11"/>
女:<input type="checkbox" name="favor" value="22"/>
人妖:<input type="checkbox" name="favor" value="33"/>
</p>
<input type="submit" value="提交"/>
</form>
</body>
</html>
|
修改views.py文件对表单处理
|
1
2
3
4
5
6
7
8
9
10
11
|
def login(request): #checkbox 多选框
if request.method == "POST":
favor_list = request.POST.getlist("favor") #getlist获取多个值
print(favor_list) #多选框获取到的是列表格式
#['11', '22', '33']
return render(request,"login.html")
elif request.method == "GET":
return render(request,"login.html")
else:
print("other")
|
2.3 上传文件
|
1
2
3
4
|
文件对象 = reqeust.FILES.get()文件对象.name文件对象.size文件对象.chunks() |
在templates目录下创建login.html
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login" method="POST" enctype="multipart/form-data">
<p>
<input type="file" name="files"/>
</p>
<input type="submit" value="提交"/>
</form>
</body>
</html>
|
修改views.py文件对表单处理
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
def login(request): #file 上传文件
if request.method == "POST":
obj = request.FILES.get('files') #用files获取文件对象
if obj:
print(obj, type(obj), obj.name)
# test.jpg <class 'django.core.files.uploadedfile.InMemoryUploadedFile'> test.jpg
import os
file_path = os.path.join('upload', obj.name)
f = open(file_path, "wb")
for item in obj.chunks(): #chunks表示所有的数据块,是个迭代器
f.write(item)
f.close()
return render(request,"login.html")
elif request.method == "GET":
return render(request,"login.html")
else:
print("other")
|
2.4 FBV & CBV
2.4.1 FBV
1.在templates目录下创建home.html文件
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/home/" method="POST">
<p>
<input type="text" name="user" placeholder="用户名"/>
</p>
<p>
<input type="password" name="pwd" placeholder="密码"/>
</p>
<p>
<input type="submit" value="提交">
</p>
</form>
</body>
</html>
|
2. 在urls.py文件增加home路径
|
1
2
3
4
5
6
7
8
|
from django.conf.urls import url,includefrom django.contrib import adminfrom cmdb import views urlpatterns = [ # 固定语法
url(r'^home/', views.Home.as_view()),
] |
3. 在views.py文件创建函数Home
|
1
2
|
def home(request): return render(request,"home.html")
|
2.4.2 CBV
1. 在templates目录下创建home.html文件
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/home/" method="POST">
<p>
<input type="text" name="user" placeholder="用户名"/>
</p>
<p>
<input type="password" name="pwd" placeholder="密码"/>
</p>
<p>
<input type="submit" value="提交">
</p>
</form>
</body>
</html>
|
2. 在urls.py文件增加home路径
|
1
2
3
4
5
6
7
8
|
from django.conf.urls import url,includefrom django.contrib import adminfrom cmdb import views urlpatterns = [ # 固定语法
url(r'^home/', views.Home.as_view()),
] |
3. 在views.py文件创建类Home
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
from django.views import View class Home(View): # 先执行dispatch里面的内容
def dispatch(self,request, *args, **kwargs):
print("before")
# 调用父类中的dispatch
result = super(Home,self).dispatch(request, *args, **kwargs)
print("after")
return result
# 根据反射获取用户提交方式,执行get或post方法
def get(self,request):
print(request.method)
return render(request,"home.html")
def post(self,request):
print(request.method)
return render(request,"home.html")
|