django_project_demo/app/views/upload.py

106 lines
3.6 KiB
Python
Raw Normal View History

2024-08-24 11:25:23 +08:00
import os
from django.shortcuts import render, redirect, HttpResponse
from django import forms
from app import models
from app.utils.bootstrap import BootstrapForm, BootstrapModelForm
from django.conf import settings
class UpForm(BootstrapForm):
"""文件上传演示表单 """
exclude_filed = ['img'] # 过滤字段不让引用Bootstrap样式
name = forms.CharField(label='姓名')
age = forms.IntegerField(label='年龄')
img = forms.FileField(label='头像')
def upload_list(request):
""" 上传文件 """
if request.method == 'GET':
return render(request, 'upload_list.html')
# POST请求
file_object = request.FILES.get('avator')
file_name = file_object.name
# 将接收到的文件,分块写入
with open(f'app/static/upload/{file_name}', 'wb') as f:
for chunk in file_object.chunks():
f.write(chunk)
return HttpResponse('上传成功')
def upload_form(request):
"""Form表单上传文件演示 """
title = 'Form上传'
# get请求只显示空白表单
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():
print(form.cleaned_data)
# cleaned_data = {'name': 'tom', 'age': 24, 'img': < InMemoryUploadedFile: 780.jpg(image / jpeg) >}
# 下一步就是处理获取到数据
# 对于上传的图像来说,先保存到本地,数据表中存储路径
image_object = form.cleaned_data.get('img')
file_name = image_object.name
# 在这里没有用windows的方式
# 为了确保在不同系统间都可以用到,
# 所以用os拼接路径 app/upload/xxx.jpg
# 重点django只认静态文件保存在static目录下用户上传的文件在media目录下需配置
# 所以想展示图片就保存在media目录下
# file_path = os.path.join(settings.MEDIA_ROOT, 'upload', file_name) # 取得是绝对路径D:\xx\xxx\xxx
file_path = os.path.join('media', 'upload', file_name)
# 将接收到的文件,分块写入
with open(file_path, 'wb') as f:
for chunk in image_object.chunks():
f.write(chunk)
# 保存数据到数据库 name,age,img对应表字段值是从form.cleaned_data获取到的
# 因为form.cleaned_data里面最初保存的是一个文件对象所以把他替换为文件路径
models.Boss.objects.create(
name=form.cleaned_data['name'],
age=form.cleaned_data['age'],
img=file_path, # 图片地址保存的是static目录下
)
return HttpResponse('上传成功')
return render(request, 'upload_form.html', {'form': form, 'title': title})
class UploadModelForm(BootstrapModelForm):
exclude_filed = ['img'] # 过滤字段不让引用Bootstrap样式
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,'title':'ModelForm上传文件'})
form = UploadModelForm(data=request.POST, files=request.FILES)
if form.is_valid():
# 对于文件会自动保存
# 路径是在models中定义的路径
# 字段中保存的是路径字符串
form.save()
return HttpResponse('上传成功')
return render(request, 'upload_form.html', {'form': form, 'title': 'ModelForm上传文件'})