web前端基础知识-(七)Django进阶

经过上节课的学习,咱们已经对Django有了简单的了解,如今来深刻了解下~html

1. 路由系统

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),
  • 找到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分组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

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,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")

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,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")
相关文章
相关标签/搜索