一、前端HTML:
1、form中必须为POST方式method="post"
<form method="post"...
2、form中必须有enctype="multipart/form-data"
<form enctype="multipart/form-data"...
3、表单input type必须为filetype="file"
<form action="/pic/upload/" method="post" enctype="multipart/form-data"> {% csrf_token %} <p><lable>标题:</lable><input type="text" name="title"></p> <p><lable>选择图片:</lable><input type="file" name="myfile"></p> <p><input type="submit" value="提交"></p> </form>
二、后端views视图:
- 取文件框里的数据:request.FILES方法
- file绑定文件流对象
- file.name文件名
- file.file 文件的字节流数据
def order_upload(request): if request.method == "GET": return render(request,'order_upload.html') elif request.method == "POST": title = request.POST.get('title') myfile = request.FILES.get('myfile') models.upload_content.objects.create(title=title,picture=myfile) return HttpResponse('--upload is ok--')
三、路由配置
1、在主路由urls.py最后添加:
from django.urls import path, from django.conf import settings from django.conf.urls.static import static urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
2、在settings.py中添加用户上传资源路径为media:
MEDIA_ROOT = os.path.join(BASE_DIR, "media") MEDIA_URL = "/media/"
3、项目根目录手动创建media文件夹
四、models.py中:
def user_directory_path(instance, filename): """自定义文件名的函数""" # 文件将被保存的路径和文件名,例如:uploads/2023/04/12/example_20230412153045.jpg ext = filename.split('.')[-1] filename = f"{os.path.splitext(filename)[0]}_{datetime.datetime.now().strftime('%Y%m%d%H%M%S')}.{ext}" # 路径可以包含子目录来组织文件,例如按年份或月份分文件夹 return os.path.join('uploads', datetime.datetime.now().strftime('%Y/%m/%d'), filename) class upload_content(models.Model): """M层upload_to=user_directory_path""" title = models.CharField(verbose_name="文件标题",max_length=200) picture = models.FileField(upload_to=user_directory_path)