day18-Django获取1个或多个数据以及文件上传

一、前言

  Django后台在提交数据的时候,我们之前都是用get或者post方法,向后台提交1个字符串,都是1个数据,那如果遇到那种多选框,同时向后台提交多个数据,后台如何获取呐?还是用同样的get的方法吗?显然不是。还有上传文件的时候,我们如何保存在本地,或者保存在某个目录文件夹中。下面我们就一起来探讨一下吧。

二、Django获取1个或者多个数据

2.1、django获取1个数据

说明:提交单条数据给后台的话,后台获取只需要: reques.POST/GET.get("name"),比如input标签type类型为   text 、password、radio,select(没有mutiple属性)等单选内容

login.html的代码:注意了,这边没有写用户名密码的输入框

<form action="/login/" method="post">
        <p>
            男:<input type="radio" name="gender" value="1"/>
            女:<input type="radio" name="gender" value="2"/>
        </p>
        <p>
            <select name="city">
                <option value="sh">上海</option>
                <option value="bj">北京</option>
                <option value="gz">广州</option>
            </select>
        </p>
        <input type="submit" value="提交"/>
    </form>
</body>

view.py代码:

def login(request):
    if request.method == "GET":
        return render(request,"login.html")
    elif request.method == "POST":
        v = request.POST.get("gender")
        print(v)
        c = request.POST.get("city")
        print(c)
    else:
        return redirect("/index/")

如图:

前端选择:

点击提交后,后台获取数据显示:

2.2、获取多个数据

 说明:提交多条数据给后台的话,后台获取只需要: reques.POST/GET.getlist("name"),比如input标签type类型为   checkbox、select(有mutiple属性)等多选内容,返回过来的是以列表的形式返回

 login.html的代码:注意了,这边没有写用户名密码的输入框

<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>
        <p>
            <select name="city" multiple>
                <option value="sh">上海</option>
                <option value="bj">北京</option>
                <option value="gz">广州</option>
            </select>
        </p>
        <input type="submit" value="提交"/>
    </form>
</body>

view.py中的代码:

def login(request):
    if request.method == "GET":
        return render(request,"login.html")
    elif request.method == "POST":
        f = request.POST.getlist("favor")
        print(f)
        c = request.POST.getlist("city")
        print(c)
        return render(request,"login.html")
    else:
        return redirect("/index/")

如图:

点击提交之后,后台获取的数据如下:

三、文件上传

  我们知道文件上传的时候,前端先把文件上传之后,后台拿到文件,然后再把文件写入到文件中,然后保存在后台的某个地方

3.1、前端编写login.html

说明:我们在上传文件的时候,需要将form标签添加enctype="multipart/form-data"属性,有这个认为是上传文件,没有这个认为,上传的是字符串。这边省略了用户名和密码的输入框。

<body>
    <form action="/login/" method="post" enctype="multipart/form-data">  #上传文件需要设置enctype="multipart/form-data"属性
        <p>
            <input type="file" name="fafa">
        </p>
        <input type="submit" value="提交"/>
    </form>
</body>

如图:

 

3.2、编写后台的代码view.py

说明:需要用request.FILES.get("name"),来获取文件,其实获取的文件是一个文件对象,通过文件对象来获取文件名和文件块,通过读取文件块写入文件中。

def login(request):
    if request.method == "GET":
        return render(request,"login.html")
    elif request.method == "POST":
        import os
        obj = request.FILES.get("fafa")
        file_path = os.path.join("upload",obj.name)
        with open(file_path,"wb") as f:
            for i in obj.chunks():
                f.write(i)
        return render(request,"login.html")
    else:
        return redirect("/index/")

证明obj是文件对象:

导入文件对象,并且查看文件对象的源码,看看有哪些可用属性:

 得知obj这个文件对象有chunks方法和name属性,chunks是表示所有的块,等文件上传到后台的时候(迭代器),通过循环的方式写入新的文件中,文件名就是obj.name。

四、总结

  1.  request.GET/POST/FILES(后台获取文件的)
  2. request.GET/POST.getlist("name")   获取chekcbox等多选内容
  3. 上传文件,form标签做特殊处理(enctype="multipart/form-data")
obj = request.FILES.get("name")

obj.name

f = open(obj.name,mode="wb")

for item in obj.chunks():
    f.write(item)
f.close()

 

posted @ 2018-03-01 14:48  帅丶高高  阅读(578)  评论(0编辑  收藏  举报