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') 名字对应
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)



