django实现文件上传

2023-11-01

在django中实现文件上传有三种方法可以实现:

  • 自己手动写
  • 使用Form组件
  • 使用ModelForm组件
    其中使用ModelForm组件实现是最简单的。

1、自己手写

先写一个上传的页面 upload_file.html
enctype="multipart/form-data 一定要加这个,不然只会上传文件名,不会上传文件内容。

{% extends 'layout.html' %}

{% block content %}
    <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>

{% endblock %}

在写一个视图函数:
在这个视图函数中如果是get 请求就展示上传的页面,如果是post 请求,就将获取到的文件对象在项目跟目录创建一个相同的文件名保存起来。

from django.shortcuts import render, HttpResponse

def upload_list(request):
    if request.method == 'GET':
        return render(request,'upload_file.html')

    print(request.POST)   # 请求体中的数据
    print(request.FILES)  # 请求发过来的文件 {}

    file_object = request.FILES.get("avatar")
    f = open(file_object.name,mode='wb')
    for chunk in file_object.chunks():
        f.write(chunk)

    f.close()
    return HttpResponse('上传成功')

简单的页面效果:
在这里插入图片描述

2、使用Form组件

提交页面时: 用户输入数据 + 文件(输入不能为空,报错)

  • Form生成HTML标签 :type=file
  • 表单的验证
  • form.cleaned_data 获取数据 + 文件对象

将上传的图片保存到static目录,并且在数据库保存文件存储的路径
models.py 中创建一个数据库

class Boss(models.Model):
    """保存图片"""
    name = models.CharField(verbose_name="姓名",max_length=32)
    age = models.IntegerField(verbose_name="年龄")
    img = models.CharField(verbose_name="图片",max_length=128)

视图函数

from django.shortcuts import render, HttpResponse
from django import forms
import os
from app01 import models

class UpForm(forms.Form):
    name = forms.CharField(label='姓名')
    age = forms.IntegerField(label='年龄')
    img = forms.FileField(label='头像')

def upload_form(request):
    if request.method == 'GET':
        form = UpForm()
        return render(request,'upload_form.html',{'form':form})

    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('static','img',image_object.name)

        file_path = os.path.join('app01',db_file_path)
        f = open(file_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 = db_file_path,
        )
        return HttpResponse('上传成功')
    return render(request,'upload_form.html',{'form':form})

upload_form.html 文件内容:

{% extends 'layout.html' %}

{% block content %}
    <div class="container">
         <div class="panel panel-default">
            <div class="panel-heading">图片上传</div>
            <div class="panel-body">
               <form  method="post"  enctype="multipart/form-data"  novalidate>
                    {% csrf_token %}
                    {% for field in form %}
                      <div class="form-group">
                        <label >{{ field.label }}</label>
                        {{ field }}
                         <span style="color:red">{{ field.errors.0 }}</span>
                      </div>
                    {% endfor %}
                      <button type="submit" class="btn btn-primary">提交</button>
                </form>
            </div>
        </div>
    </div>
{% endblock %}

页面效果:
在这里插入图片描述

3、使用ModelForm组件

使用ModelForm的前提条件要设置好media 目录

启用media 目录

在django的开发中有两个特殊的文件夹:

  • static , 存放静态文件的路径,包括: css、js 、项目图片。
  • media , 用户上传的数据目录。
    1、在urls.py中的配置
from django.urls import path,re_path
from django.views.static import serve
from django.conf import settings

urlpatterns = [
    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/"

models.py 重新创建一个表来存储文件路径

class City(models.Model):
    """城市"""
    name = models.CharField(verbose_name="名称",max_length=32)
    count = models.IntegerField(verbose_name="人口")

    # 本质上数据库也是charField ,自动保存数据,upload_to 表示会保存到media目录下的city
    img = models.FileField(verbose_name='Logo',max_length=128,upload_to='city/')

视图函数:
通过 form.save() django 自动将文件存储到media目录下的city目录,并且把文件路径保存到数据库

from django.shortcuts import render, HttpResponse
from app01 import models
from app01.utils.bootstrap import BootStrapModelForm

class UploadModelForm(BootStrapModelForm):
    bootstrap_exclude_name = ['img']
    class Meta:
        model = models.City
        fields = "__all__"

def upload_modelform(request):
    if request.method == 'GET':
        form = UploadModelForm()
        return render(request,'upload_form.html',{'form':form})

    form = UploadModelForm(data=request.POST,files=request.FILES)
    if form.is_valid():
        form.save()
        return HttpResponse('上传成功')
    return render(request, 'upload_form.html', {'form': form})

upload_form.html

{% extends 'layout.html' %}

{% block content %}
    <div class="container">
         <div class="panel panel-default">
            <div class="panel-heading">图片上传</div>
            <div class="panel-body">
               <form  method="post"  enctype="multipart/form-data"  novalidate>
                    {% csrf_token %}
                    {% for field in form %}
                      <div class="form-group">
                        <label >{{ field.label }}</label>
                        {{ field }}
                         <span style="color:red">{{ field.errors.0 }}</span>
                      </div>
                    {% endfor %}
                      <button type="submit" class="btn btn-primary">提交</button>
                </form>
            </div>
        </div>
    </div>
{% endblock %}

效果:
在这里插入图片描述
数据库存储的:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

django实现文件上传 的相关文章

随机推荐

  • 图片风格快速转换的简单web实现

    图片风格快速转换的简单web实现 图片风格转换 是指利用深度学习算法学习某种风格图片的特征 将其应用到另一张图片中 合成新风格的图片 目前技术较为成熟 github上有很多有趣的项目与应用 本项目核心代码基于fast neural styl
  • NCC常用操作自助工具

    selftool 介绍 NChome操作自助工具 对常用操作进行了集成 类图 工具使用 功能介绍 初始化配置 点击按钮可对nchome进行关联 重启服务 点击按钮一键重启服务 sysConfig 点击按钮一键打开home配置界面 clear
  • 云计算技术与应用赛项竞赛试题(样卷)

    选手须知 1 竞赛试题通过在线 云计算技术与应用 竞赛考试系统和书面文档共同发布 内容完全一致 如出现纸质任务书缺页 字迹不清 与考试系统中不一致等问题 请及时向裁判示意 并进行任务书的更换 2 参赛团队应在4小时内完成任务书规定内容 选手
  • 尝试实现带有迭代器的 vector

    两个注意点 1 底层内存分配采用 new 和 delete 非 stl 书中所示 2 移动元素为集体后移 并非原书中拆解后移 原书移动方式原因未知 include
  • docker部署多个mysql容器,并使用java连接

    测试springboot多个数据源配置时 需要安装多个mysql容器 由于资源限制 当前只有一台虚拟机 如果在一台机器上安装多个mysql实例 是可以的 但步骤比较繁琐 使用docker来安装MySQL容器 非常简单 只需要简单几步 对于测
  • vue创建WebSocket进行实时通讯

    vue WebSocket创建实现实时通讯 websocket async initWebSocket if websock return if const chatid return if typeof WebSocket undefin
  • C++标准库头文件(工具库->typeinfo)

    参考网址 https zh cppreference com w cpp header https blog csdn net w55100 article details 80330812 工具库 typeinfo 运行时类型信息工具 类
  • 3. Unity之三维模型

    1 网格 Mesh 三维物体模型在unity中一般称为mesh 即网格数据 模型一般使用专用的建模软件设计 将mesh文件导入到unity中进行使用 一般mesh中保存的是三维模型的面和顶点数据 在unity中通过下图方法进行调整 其中 S
  • JUC 十三. CountDownLatch 与 CyclicBarrier 与 Semaphore 基础使用与底层原理

    目录 一 CountDownLatch 减少计数器 二 CyclicBarrier 循环栅栏 三 Semaphore 信号灯 四 CountDownLatch 底层实现 await 判断state 也可以简单理解为计数 如果为0获取锁成功
  • css背景 背景颜色 颜色渐变

    背景全屏 body background image url imgs bj png background repeat no repeat background size 100 100 background attachment fix
  • 私信功能

    最近在做一个私信的功能 一张message表 存储消息内容和创建者id 一张user message表 存储发送者 接收者及消息id 本以为考虑还算周全 今天又查看了一些文章 发现还是差的远 下面是从OSChina转来的一篇文章 比我设计的
  • 关于Filter 覆盖getParameterMap 来实现功能

    在获得请求中的参数时 有三种方法 getParameter getParameterMap getParameterValues 这三种方法在底层实现中是互相调用的 所以若要彻底解决提交乱码的问题 则需要覆盖这三个方法 覆盖getParam
  • uLua中遇到的问题

    1 C 调用lua函数参数为空的问题 在C 中调用以 定义的函数传参时 self被第一个参数覆盖 而obj将为空 MessagePanel function MessagePanel Test1 obj lua调用正常 obj为传入参数 s
  • 上银伺服驱动器接线图_FRLS10205A4C上银伺服电机HIWIN D2-1023-P-C0 FRMS7520508C MD-36-S2...

    mega fabe成都上银伺服驱动器维修MD 18 DFRLS10205A4C上银伺服电机HIWIN D2 1023 P C0 FRMS7520508C MD 36 S2 能够发挥最大效能 ST系列电机SD300 310 系列 SD系列交流
  • pluto实现分析(19)

    本文档的Copyleft归yfydz所有 使用GPL发布 可以自由拷贝 转载 转载时请保持文档的完整性 严禁用于任何商业用途 msn yfydz no1 hotmail com 来源 http yfydz cublog cn 15 快速模式
  • 华为OD机试真题- 喊7的次数重排-2023年OD统一考试(B卷)

    题目描述 喊7是一个传统的聚会游戏 N个人围成一圈 按顺时针从1到N编号 编号为1的人从1开始喊数 下一个人喊的数字为上一个人的数字加1 但是当将要喊出来的数字是7的倍数或者数字本身含有7的话 不能把这个数字直接喊出来 而是要喊 过 假定玩
  • python怎么产生随机浮点数_python3生成随机数的几种常用方法

    前言 python中生成随机数主要用到random模块 方法主要包括 randint uniform random sample choice等几种常用方法 本篇教程就来说说这几种方法的使用方式 以及唯一流水号 时间戳 和验证码的实例展示
  • 高德地图的逆地理编码

    在一些比赛中 我们经常需要将地理位置转化为经纬度坐标 地理编码 或是将经纬度坐标转化为对应的地理位置 逆地理编码 对于这类问题 一般需要调用某个地图的API来实现 这里以高德地图的API为例 介绍如何实现逆地理编码 第一步 在高德地图API
  • ogre引擎0.12.0抄写记录

    惊喜地发现 文档齐全 可以参考类图抄 C Users Legion Desktop ogre v0 12 0 ogrenew Docs api html hierarchy html 先进行 1 OgreMain 然后 2 RenderSy
  • django实现文件上传

    在django中实现文件上传有三种方法可以实现 自己手动写 使用Form组件 使用ModelForm组件 其中使用ModelForm组件实现是最简单的 1 自己手写 先写一个上传的页面 upload file html enctype mu