【web开发】11、文件的上传

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档



提示:以下是本篇文章正文内容,下面案例可供参考

一、文件上传

图片文件上传:在form 里添加 enctype=“multipart/form-data”
取值:request.POST和request.FILES

#upload_list.html
<div class="container">
        <form method="post" enctype="multipart/form-data">
            {% csrf_token %}
            <input type="text" name="username">
            <input type="file" name="avatar">
            <input type="submit" value="提交">

        </form>
    </div>
def upload_list(request):
    if request.method == "GET":
        return render(request,'upload_list.html')
    # print(request.POST)
    # print(request.FILES)
    file_object = request.FILES.get("avatar")
    print(file_object.name)   #获取文件名

    f = open('a2.png',mode='wb')
    for chunk in file_object.chunks():
        f.write(chunk)  #写入到文件中
    f.close()
    return HttpResponse("...")

在这里插入图片描述

二、批量上传

1.安装openpyxl

pip install openpyxl

2.< input type=“file” name=“exc”>
file_object = request.FILES.get(“exc”)

#html
<div class="panel-heading">
                <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>
                批量上传
</div>
<div class="panel-body">
     <form method="post" enctype="multipart/form-data" action="/depart/multi/">
          {% csrf_token %}
          <div class="form-group">
              <input type="file" name="exc">
          </div>
          <input type="submit" value="上传" class="btn btn-info btn-sm">
     </form>
</div>
# depart_multi
def depart_multi(request):
    """批量上传 (excel文件)  """
    #1.获取用户上传的文件对象
    file_object = request.FILES.get("exc")
    print(file_object)

    #2.对象传递给openpyxl,并从中读取文件内容
    from openpyxl import load_workbook
    wb = load_workbook(file_object)   #文件路径
    sheet = wb.worksheets[0]
    # cell =sheet.cell(1,1)
    # print(cell.value)
    #3.循环获取每一行数据
    for row in sheet.iter_rows(min_row=2):
        text = row[0].value
        print(text)
        models.Department.objects.create(title=text)
    return redirect("/depart/list/")
#py
def depart_multi(request):
    """批量上传 (excel文件)  """
    #1.获取用户上传的文件对象
    file_object = request.FILES.get("exc")
    print(file_object)

    #2.对象传递给openpyxl,并从中读取文件内容
    from openpyxl import load_workbook
    wb = load_workbook(file_object)   #文件路径
    sheet = wb.worksheets[0]
    # cell =sheet.cell(1,1)
    # print(cell.value)
    
    #3.循环获取每一行数据
    for row in sheet.iter_rows(min_row=2):
        text = row[0].value
        print(text)
        models.Department.objects.create(title=text)
    return redirect("/depart/list/")

在这里插入图片描述

三、案例:混合数据(form上传)

在这里插入图片描述
1.< form method=“post” enctype=“multipart/form-data” action=“/depart/multi/”>

#html
<form class="form-horizontal" method="post" novalidate>
	<form method="post" enctype="multipart/form-data" novalidate>
	 {% csrf_token %}
	 {% for field in form %}
	     <div class="form-group">
	         <div class="col-sm-offset-2 col-sm-10">
	             <label>{{ field.label }}</label>
	             {{ field }}
	             <span style="color: red">{{ field.errors.0 }}</span>
	         </div>
	     </div>
	 {% endfor %}
	 <div class="panel-heading col-sm-offset-2 col-sm-10" >
	     <form method="post" enctype="multipart/form-data" action="/depart/multi/">
	         <input type="submit" value="上传" class="btn btn-info btn-ms">
	     </form>
 	</div>
	</form>
</form>

2.img = forms.FileField(label=“头像”)
form = UpFOrm(data=request.POST,files=request.FILES)

from django import forms

class UpForm(BootstrapForm):
    bootstrap_exclude_fields = ['img']
    name = forms.CharField(label="姓名")
    age = forms.IntegerField(label="年龄")
    img = forms.FileField(label="头像")


import os
def upload_form(request):
    title="Form上传"
    if request.method == "GET":
        form = UpForm()
        return render(request,'upload_form.html',{"form":form,"title":title})
    form = UpForm(data=request.POST,files=request.FILES)
    if form.is_valid():
        #1.读取图片内容,写入到文件夹中并获取文件的路径
        image_object = form.cleaned_data.get("img")
        db_file_path = os.path.join("media",image_object.name)
        media_path = os.path.join("app01",db_file_path)

        f =open(media_path,mode='wb')
        for chunk in image_object.chunks():
            f.write(chunk)
        f.close()
        #2.将图片文件路径写入到数据库
        models.Boss.objects.create(
            name = form.cleaned_data['name'],
            age = form.cleaned_data['age'],
            img = media_path,

        )
        return HttpResponse("...")
    return render(request, 'upload_form.html', {"form": form, "title": title})

四、启用media

1.在urls.py中进行配置

re_path(r’^media/(?P< path>.*)$', serve, {‘document_root’: settings.MEDIA_ROOT},name=‘media’),

2.在settings.py中

import os
MEDIA_ROOT = os.path.join(BASE_DIR,“media”)
MEDIA_URL = “/media/”

五、案例:混合数据(Modelform上传)

在这里插入图片描述

1.models.py 定义city数据表

class City(models.Model):
    name = models.CharField(verbose_name="名称",max_length=32)
    count = models.IntegerField(verbose_name="人口")
    img = models.FileField(verbose_name="Logo",max_length=128,upload_to="city/")

2.定义ModelForm

from app01.utils.bootstrap import BootstrapModelForm

class UpModelForm(BootstrapModelForm):
    bootstrap_exclude_fields = ['img']
    class Meta:
        model = models.City
        fields = "__all__"

3.视图
GET:form =UpModelForm()
POST:form = UpModelForm(data=request.POST,files=request.FILES)

def upload_model_form(request):
    title = "ModelForm上传文件"
    if request.method == "GET":
        form =UpModelForm()
        return render(request,'upload_model_form.html',{"form":form,"title":title})
    form = UpModelForm(data=request.POST, files=request.FILES)
    if form.is_valid():
    #自动保存且存在数据库中
        form.save()
        return HttpResponse("成功")
    return render(request, 'upload_model_form.html', {"form": form, "title": title})

小结

  • 手动去写

file_object = request.FILES.get(“exc”)

  • Form组件(表单验证)
request.POST
file_object = request.FILES.get("exc")
...
  • Form组件(表单验证+自动保存数据库+自动保存文件)

media文件夹
models.py定义类文件要:
img = models.FileField(verbose_name=“Logo”,max_length=128,upload_to=“city/”)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TechMasterPlus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值