经过上节课的学习,咱们已经对Django有了简单的了解,如今来深刻了解下~html
1.1 单一路由对应python
1
|
url(r
'^index$'
, views.index),
|
1.2 基于正则的路由django
1
2
|
url(r
'^index/(\d*)'
, views.index),
url(r
'^manage/(?P<name>\w*)/(?P<id>\d*)'
, views.manage),
|
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),
]
|
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分组app
在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文件建立对应方法post
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.htmlui
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对路由分类url
主程序urls.py文件spa
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
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,include
from django.contrib import admin
from 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")
|
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,include
from django.contrib import admin
from 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")
|