Django框架获取多个数据以及实现文件上传功能

鳄鱼君Ba

发表文章数:514

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python教程 » Django框架获取多个数据以及实现文件上传功能

用户直接在浏览器的搜索栏输入URL访问是GET请求,用户提交表单属于POST请求,我们通过请求方式可以在后台获取到相应的数据。对于login.html可以让用登录,也可以让用户注册,注册收集的个人信息比较多,那么如何获取多个数据呢?

我们按照前面掌握的知识创建好django工程,首先在settings.py中配置静态目录和模板路径:

STATIC_URL = '/static/'
STATICFILES=(
    os.path.join(BASE_DIR,'static')
)


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

# 'django.middleware.csrf.CsrfViewMiddleware',

urls.py

from django.contrib import admin
from django.urls import path
from myapp import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/',views.login)
]

views.py

from django.shortcuts import render

# Create your views here.
def login(request):
    if request.method=='GET':
        return render(request,'login.html')
    elif request.method=='POST':
        user=request.POST.get('use')
        pwd=request.POST.get('pwd')
        gender=request.POST.get('gender')
        print(user,pwd,gender)
    return render(request,'login.html')

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户信息提交</title>
</head>
<body>
<form action="/login/" method="post">
    <p>
     用户名:<input type="text" name="use" placeholder="用户名">
     密码:<input type="password" name="pwd" placeholder="密码">
    </p>
    <p>  {#单选框#}
        男:<input type="radio" name="gender" value="1">
        女:<input type="radio" name="gender" value="2">
    </p>
    <strong>爱好</strong> {# 多选框 #}
    <p>
        篮球<input type="checkbox" name="hobby" value="1">
        游戏<input type="checkbox" name="hobby" value="2">
        足球<input type="checkbox" name="hobby" value="3">
    </p>
    <p>  {# 下拉选择框,可以是多选#}
        城市:
        <select name="city" multiple>
            <option value="北京">北京</option>
            <option value="郑州">郑州</option>
            <option value="河南">河南</option>
        </select>

    </p>
    <input type="submit" value="提交">
</form>
</body>
</html>

以上是我们前面讲过的内容。其中男女属于单选框,后台可以根据value的值判断男女;爱好属于多选框,也就是有多个值传入到后台,login函数中没有进行获取,我们可以使用getlist方法获取多个值:

from django.shortcuts import render
from django.shortcuts import redirect
# Create your views here.
def login(request):
    if request.method=='GET':
        return render(request,'login.html')
    elif request.method=='POST':
        hobby=request.POST.getlist('hobby')  #get的是name值,后台显示的是value值
        city=request.POST.getlist('city')
        print(hobby,city)
    else:
        return redirect('https://www.e1yu.com')
    return render(request,'login.html')

这样在后台返回的就是一个list列表,非常的简单,那么使用getlist就可以获取用户提交的多个数据了,还有一种就是文件上传,用户想要向服务器上传文件图片什么的,该如何做呢?按照数据的获取方式,后台需要知道文件名字文件内容,然后才能读并存储到服务器上。get方法只会读取到文件名字,不能拿到文件的内容,其实文件内容不再reqeust.POST里面而是在request.FILES,我们可以来尝试一下:

from django.shortcuts import render
from django.shortcuts import redirect
# Create your views here.
def login(request):
    if request.method=='GET':
        return render(request,'login.html')
    elif request.method=='POST':
        file=request.FILES.get('wj')
        print(file,type(file))
        #<class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
    else:
        #PUT OPTION
        return redirect('https://www.e1yu.com')
    return render(request,'login.html')

上传文件需要对login.html做一些修改:

<form action="/login/" method="post" enctype="multipart/form-data">  {# 上传文件 #}
    <p>
        <strong>文件上传</strong>
        <input type="file" name="wj">
        <input type="submit" value="上传">
    </p>
</form>

打印file的值,是一个文件名,查看file的类型是一个类UploadedFile(File),这个需要你自己去查看。file是一个文件名,file.name也是一个文件名(可以自己尝试)。文件内容就在file.chunks(),类里面可以找到它,它内部使用的是yield,是一个迭代器,需要使用for循环接收,我们在这里创建一个update文件夹,用于接收用户上传的文件,为了避免目录混乱,那么修改views.py文件为:

from django.shortcuts import render
from django.shortcuts import redirect
import os
# Create your views here.
def login(request):
    if request.method=='GET':
        return render(request,'login.html')
    elif request.method=='POST':
        file=request.FILES.get('wj')
        file_path = os.path.join('update', file.name)  #上传到update文件夹中
        f = open(file_path,'wb')
        for i in file.chunks():
            f.write(i)
        f.close()
    else:
        #PUT OPTION
        return redirect('https://www.e1yu.com')
    return render(request,'login.html')

这样就实现了图片上传的功能,赶紧取测试一下吧!回顾一下主要使用的方法:

reqeust.GET
reqeust.POST
reqeust.FILES

#多选的内容
request.POST.getlist()
#上传文件 修改form支持文件上传
file=reqeust.FILES.get('file')
f=open(file,mode='wb')
for i in file.chunks():
    f.write(i)
f.close()

– END –

未经允许不得转载:作者:鳄鱼君Ba, 转载或复制请以 超链接形式 并注明出处 鳄鱼君Ba
原文地址:《Django框架获取多个数据以及实现文件上传功能》 发布于2020-04-10

分享到:
赞(2) 赏杯咖啡

评论 抢沙发

7 + 7 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册