一、前言
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。
四、总结
- request.GET/POST/FILES(后台获取文件的)
- request.GET/POST.getlist("name") 获取chekcbox等多选内容
- 上传文件,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()