1. 建立模型
1.1 数据库的配置:
#setting.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_file',
'USER':'root',
'PASSWORD':'123456',
'HOST':'127.0.0.1',
'PORT':'3306',
}
}
1.2 模型的编写:
#models.py
class UploadFile(models.Model):
# 设置要上传的文件
file = models.FileField(upload_to=generate_filename,null=True,blank=True)
# 设置要上传的图片
img = models.ImageField(upload_to=generate_imgname,null=True,blank=True)
# 说明
desc = models.CharField(max_length=100,null=True,blank=True)
# 重写__str__方法
def __str__(self):
return f'{self.file.name}=={self.img.name}=={self.desc}'
class Meta:
db_table = 't_upload_file'
verbose_name = '上传文件'
字段的介绍:
FileField:用于一般文件
ImageField:用于图片文件
1.3 模型迁移到数据库:
#终端输入
pythonmanage.pymakemigrations
pythonmanage.pymigrate
可能保存没有安装pillow库,
如果出现则输入:
pip install pillow==9.3.0
2.建立media文件夹
2.1 配置媒体文件的路径
#setting.py
# 设置获取的文件的路径
MEDIA_URL='/media/'
# 设置文件要存储的路径
MEDIA_ROOT=os.path.join(BASE_DIR,'media')
需要自己去根项目创建media文件夹
2.2 配置访问路径
#urls.py
from django.conf.urls.static import static
from django.conf import settings
if settings.DEBUG:
urlpatterns +=static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
一般开发环境自己看看,生产环境该文件都是云储存,因为这样增加效率。
案例
配置好以上就可以使用啦,以下是使用的学习示范:
提供路由和视图与模版源代码与效果展示。
我创建的app应用叫file_app,通过终端命令创建,可以不一样,注意代码替换:
python manage.py startapp file_app
项目路由:
#urls.py
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('file_app.urls'))
]
from django.conf.urls.static import static
from django.conf import settings
if settings.DEBUG:
urlpatterns +=static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
app路由:
# file_app/urls.py
from django.urls import path
from .views import upload_file,get_file
urlpatterns = [
path('upload_file/',upload_file,name='upload_file'),
path('get_file/<int:pk>/',get_file,name='get_file'),
]
视图函数:
# file_app/views.py
from django.shortcuts import render
from .models import UploadFile
# Create your views here.
def upload_file(request):
if request.method=='GET':
return render(request,'upload_file.html')
elif request.method =='POST':
# 接收上传的文件
file_obj = request.FILES.get('file')
# 接收上传的图片
img_obj = request.FILES.get('img')
# 接收文件说明
desc = request.POST.get('desc')
# 创建对象
upload_file_obj = UploadFile()
upload_file_obj.file = file_obj
upload_file_obj.img = img_obj
upload_file_obj.desc = desc
# 保存
upload_file_obj.save()
return render(request,'show.html',{'upload':upload_file_obj})
def get_file(request,pk):
# 根据主键获取对象
upload_file_obj = UploadFile.objects.get(pk=pk)
return render(request,'show.html',{'upload':upload_file_obj})
模板
在app下创建templates文件夹用于存放模板文件,
再配置:
# settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
创建两个html文件用于上传和展示效果:
# templates/up_load_file.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>上传文件</title>
</head>
<body>
<h2>文件的上传</h2>
<form action="/upload_file/" method="post" enctype="multipart/form-data">
{% csrf_token %}
上传的文件:<input type="file" name="file"><br>
上传的图片:<input type="file" name="img"><br>
备注:<input type="text" name="desc"><br>
<input type="submit" value="上传">
</form>
</body>
</html>
# templates/show.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>查看上传的文件</title>
</head>
<body>
<h2>查看上传的文件</h2>
<ul>
<li>文件名:{{upload.file.name}}</li>
<li>文件的路径:{{upload.file.url}}</li>
<li>图片名:{{upload.img.name}}</li>
<li>图片的路径:{{upload.img.url}}</li>
<li><img src="{{upload.img.url}}" alt="" srcset=""></li>
<li>备注:{{upload.desc}}</li>
</ul>
</body>
</html>
网站效果:
本节完,拜拜。