栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

django 实现文件上传并保存

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

django 实现文件上传并保存

models.py
from django.db import models

class UploadFile(models.Model):
    title = models.CharField(verbose_name="图片标题", max_length=50)
    path = models.FileField(upload_to='files/')
views.py
from django.shortcuts import render, HttpResponse
from .models import UploadFile

def upload_file(request):
    if request.method == "POST":
        up_file = request.FILES.get('upload_file')
        UploadFile(title=up_file.name, path=up_file).save()
        return HttpResponse('success')
    else:
        return render(request, "blog/upload_file.html")
upload_file.html
  • enctype="multipart/form-data"
  • name="upload_file" 与 request.FILES.get('upload_file') 名字对应
    
{% csrf_token %}

settings.py
  • 指定上传文件保存路径的根目录
MEDIA_ROOT = os.path.join(base_DIR, 'upload')
urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('uploadfile/', views.upload_file, name="upload_file"),

]

实现保存的文件与 request 内容相关

def upload_file(request):
    if request.method == "POST":
        up_file = request.FILES.get('upload_file')
        UploadFile(title=up_file.name, path=up_file).save(request=request)
        return HttpResponse('success')
    else:
        return render(request, "blog/upload_file.html")
根据函数返回值,保存文件 方式1

函数默认会传入

  • instance 为 UploadFile 实例
  • filename 为文件名
from django.db import models

def upload_path(instance, filename):
    print(instance.rq)
    print(filename)
    return "files/"

class UploadFile(models.Model):
    title = models.CharField(verbose_name="图片标题", max_length=50)
    path = models.FileField(upload_to=upload_path)
    rq = None

    def save(self, *args, **kwargs):
        UploadFile.rq = kwargs.pop("request")
        print(UploadFile.rq)
        super().save(*args, **kwargs)
方式2
  • 对模型添加设置与获取 request 的方法
from django.shortcuts import render, HttpResponse
from .models import UploadFile

def upload_file(request):
    if request.method == "POST":
        up_file = request.FILES.get('upload_file')
        f = UploadFile(title=up_file.name, path=up_file)
        f.set_request(request)
        f.save()
        return HttpResponse('success')
    else:
        return render(request, "blog/upload_file.html")
from django.db import models

def upload_path(instance, filename):
    print(instance.get_request().method)
    print(filename)
    return "files/"

class UploadFile(models.Model):
    title = models.CharField(verbose_name="图片标题", max_length=50)
    path = models.FileField(upload_to=upload_path)

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

    def set_request(self, request):
        self.request = request

    def get_request(self):
        return self.request

文件下载 方式1
  • 利用 django 静态文件特性,保存上传文件到静态文件目录下,利用静态文件下载功能实现
STATIC_URL = '/static/'
STATICFILES_DIRS = [
   os.path.join(base_DIR, 'static')
]
MEDIA_ROOT = os.path.join(base_DIR, 'static')

下载界面

    {% for file_obj in file_list %}
    
    {% endfor %}
方式2
  • 保存到 media 目录,需要配置路由,path 会自动传入 serve 作为参数
from django.conf.urls import url
from django.urls import path
from django.views.static import serve

urlpatterns = [
    url(r'^media/(?P.*)', serve, {"document_root": settings.MEDIA_ROOT}),
]
方式3
  • 保存到 media 目录
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/275860.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号