Django中的视图

一、Django中的视图  

CBV和FBV

我们之前写过的都是基于函数的view,就叫FBV。还可以把view写成基于类的。

1
url(r '^add_publisher/' ,views.AddPublisher.as_view)

在views里添加

1
2
3
4
5
6
7
8
9
10
11
from  django.views import View
class  AddPublisher(View):
     def  get (self, request):
         return  render(request,  'add_publisher.html' )
     def post(self,request):
         new_name =request.POST. get ( 'publisher_name' ,None)
         if  new_name:
             models.Publisher.objects.create(name=new_name)
         else :
             error_msg = "出版社名称不存在"
             return   render(request, 'add_publisher.html' ,{ 'error' :error_msg})

 

Request对象

请求相关的常用值

  • path_info     返回用户访问url,不包括域名
  • method        请求中使用的HTTP方法的字符串表示,全大写表示。
  • GET              包含所有HTTP  GET参数的类字典对象
  • POST           包含所有HTTP POST参数的类字典对象
  • body            请求体,byte类型 request.POST的数据就是从body里面提取到的

2. request对象
1. 之前学过的
1. request.method --> 获取请求的方法(GET、POST等)
2. request.GET --> 通常用来获取URL里面的参数  
127.0.0.1:8000/edit_book/?id=1&name=yimi
request.GET --> {"id":1, "name":"yimi"}
request.GET.get("id")
3. request.POST --> 用来获取POST提交过来的数据
request.POST.get("book_name")
2. 补充其他常用的:
1. request.path_info --> 获取用户请求的路径(不包含IP和端口和URL参数)
2. request.body  

3. response
基础必备三件套(求学要严谨)
1. HttpResponse --> 返回字符串内容
2. render --> 返回一个html页面  
3. redirect --> 返回一个重定向(告诉浏览器再去访问另外的网址)

4. JsonResponse

三、Response对象

与由Django自动创建的HttpRequest对象相比,HttpResponse对象是我们的职责范围了。我们写的每个视图都需要实例化,填充和返回一个HttpResponse。

  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>upload</title>
</head>
<body>
 
<form action= "/upload/"  method= "post"  enctype= "multipart/form-data" >
     <input type= "file"  name= "upload_file" >
     <input type= "submit"  value= "开始上传" >
 
</form>
</body>
</html>

 

url(r'^upload/',views.upload)

views文件

 下面def upload(request):

if request.method =='POST':
        print(request.FILES) 
 下面是print request.FILES的值
<MultiValueDict: {'upload_file': [<TemporaryUploadedFile: 02 python fullstack s10 day08 集合.avi (video/avi)>]}>
        print(request.FILES['upload_file'].name )  #拿到文件的名字
python fullstack s10 day08 集合.avi
        file_name = request.FILES['upload_file'].name  #拿到文件的名字
        with open(file_name,'wb')as f:
            for chunk in  request.FILES['upload_file'].chunks():
                f.write(chunk)
        return HttpResponse('上传OK')

    else:
        return render(request, 'upload_file.html')

jason 

url(r'^json_data/',views.json_test),
def json_test(request):
    data ={'name':'小黑','age':19}
    import json
    data_str =json.dumps(data) #把data序列化成json格式的字符串
    return HttpResponse(data_str)

def json_test(request):
    data ={'name':'小黑','age':19}
   data2 =[1,2,3,45,6,5]
    # import json
    # data_str =json.dumps(data) #把data序列化成json格式的字符串
    # return HttpResponse(data_str)
    from django.http import JsonResponse
    return JsonResponse(data2)   #这个代码会报错,因为只接受字典的 形式。
    return JsonResponse(data,safe =False)

Django shortcut functions

1
url(r '^book/[0-9]{2,4}/$' ,views.book),

  

1
url(r '^book/([0-9]{2,4})/([a-zA-Z]{2})/$' ,views.book)

  

1
2
3
4
def book(request,arg1,arg2):#传三个参数
     print( 'arg1:' ,arg1)
     print( 'arg2:' ,arg2)
     return  HttpResponse( '口哥说一个 ' )

  

案例分析

# url(r'^publisher_del/',views.publisher_del),
    url(r'^publisher_del/[0-9]+',views.publisher_del),
# def publisher_del(request):##只传一个参数
#     del_id =request.GET.get('id')
#     models.Publisher.objects.get(id=del_id).delete()
#     print(111)
#     return redirect('/publisher_list/')


# URL分组匹配
def publisher_del(request,del_id): #传两个参数
    models.Publisher.objects.get(id=del_id).delete()
    print(111)
    return redirect('/publisher_list/')

猜你喜欢

转载自www.cnblogs.com/chongdongxiaoyu/p/9019617.html
今日推荐