4)django-视图view

视图是django功能函数,结合url使用

1.视图方式     

  视图方式经常用的有两种  

  用户GET获取数据
     用户POST提交数据
    
       用户第一次访问页面是GET
       用户第交表单是POST
       视图:可以通过request.method判断是请求方式

  django常用的方法:

  reqeust.method

  request.body封装了很多请求内容信息,比如GET,POST等

  request.GET

  request.POST GET和POST都是从body拿的内容,body还其他方法如delete,put等提交方式

  request.path_info

  request.FILES

  request.Cookie

  request.META封装了很多请求头信息

2.获取用户请求数据    

  1)如果用户以GET方式访问         

      视图request.GET.get("xx")获取数据,此数据包含在请求头,即URL中。
        
        http://127.0.0.1:8000/login?id=3
    
        views.py
        request.GET.get("id") id和URL中的id对应     

  

    def detail(request):
      id=request.GET.get("id")
      return  render(request,"detail.html",{"detail_info":USER_DICT.get(id)})

 2)如果以POST方式响应

        
        A)获取单行或者单选数据,比如input,radio,select(单选)
        request.POST.get("XX")获取数据
        
        B)获取多选数据,比如checkbox,select(多选)
        request.POST.getlist("xxx")

        C)上传文件

  request.FILES#当上传文件的时候所有 文件内容都到了FILES,包括文件名。

  当form没有设置enctype="multipart/form-data

     f=request.POST.get("fafafa") #s可以拿到文件名

     而request.FILES.get("fafafa")#这里会返回是一个None

  当form设置enctype="multipart/form-data

    enctype="multpart/form-data"模式下:input内容会放到POST里面,file会放到FILE里面

        # 需要在 form中设置enctype="multpart/form-data",如果没有enctype上传的时候只是字符串,如果加了上传内容,所f=request.POST.get("fafafa")会显示None
        #enctype="multpart/form-data"模式下:input内容会放到POST里面,file会放到FILE里面

  file其他方法

  文件对象 = reqeust.FILES.get()
  文件对象.name
  文件对象.size
  文件对象.chunks()表示一点一点上传

obj = request.FILES.get('fafafa')
obj.name
f = open(obj.name, mode='wb')
for item in obj.chunks():
  f.write(item)
f.close()

3.视图渲染方式

  导入模块

 from django.shortcuts import render,HttpResponse,redirect

  return HttpRespone("字符串")       #直接返回字符串
        return render(request,"模板的文件的路径")    #渲染到页面,第二个参数是html模块路径
        return redirect("只能URL路径")           #跳转,不能直接写"html模块路径",因为拿不到别人的模板路径,

                     所以这里应该写URL路径比如:“http://www.baidu.com”,或者本地URL"/home"

4.什么时候渲染

  

在渲染之前替换,所以html拿到都是渲染好的
    def func(request):
        return render(request,"index.html",{"current_user":"alex"})
    
    <div>{{current_user}}</div> 
    最后生成字符串
    <div>alex</div> 
什么时候变替换:在
渲染之前替换,所以html拿到都是渲染好的

  

5.示例         

模板HTML代码login.html

<!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="text" name="username" placeholder="用户名"/>
    </p>
    <p>
        <input type="password" name="password" placeholder="密码"/>
    </p>
    <p>
        男:<input type="radio" name="gender" value="1"/>
        女:<input type="radio" name="gender" value="2"/>
    </p>
    <p>
        男:<input type="checkbox" name="favor" value="11"/>
        女:<input type="checkbox" name="favor" value="22"/>
    </p>
    <p>
        <select name="city1">
            <option value="111">上海</option>
            <option value="111">北京</option>
            <option value="111">深圳</option>
        </select>
    </p>

        <p>
        <select name="city2" multiple="multiple">
            <option value="111">上海</option>
            <option value="111">北京</option>
            <option value="111">深圳</option>
        </select>
    </p>
    <p>
        <input type="file" name="fafafa">
    </p>
    <input type="submit" value="提交">
</form>
</body>
</html>

  views.py

def login(request):
    if request.method=="GET":
        return render(request,"login.html")
    elif request.method=="POST":
        u=request.POST.get("username")
        p=request.POST.get("password")

        #radis
        r=request.POST.get("gender")
        print(r)
        #获取checkbox
        c1=request.POST.get("favor")
        c2=request.POST.getlist("favor")
        print(c1,c2)


        # f=request.POST.get("fafafa") #默认只能拿到文件名
        # fc=request.FILES#当上传文件的时候所有内容都到了FILES,包括文件名
        # f1=request.FILES.get("fafafa")#这里会返回是一个None,
        # 需要在 form中设置enctype="multpart/form-data",如果没有enctype上传的时候只是字符串,如果加了上传内容,所f=request.POST.get("fafafa")会显示None
        #enctype="multpart/form-data"模式下:input内容会放到POST里面,file会放到FILE里面
        # print(f,fc,f1)
        # print(f)

        f1=request.FILES.get("fafafa") #打印出来像字符串,其实是django.core.files.uploadedfile.InMemoryUploadedFile,f1.name属性== InMemoryUploadedFile,有__repr__()
        print(f1,type(f1),f1.name)
        f1.chunks()#表示一点点取文件

        f=open(f1.name,mode='wb')
        for i in f1.chunks():
            f.write(i)

        f.close()

        if u=="root" and p=="123":
            return redirect("/index/")
        else:
            return render(request,"login.html")
原文地址:https://www.cnblogs.com/lixiang1013/p/7747893.html