一、设置路径
首先,在settings.py 文件的中设置 MEDIA_ROOT 和 MEDIA_URL 两个参数。其中MEDIA_ROOT 表示文件存储的根目录,MEDIA_URL 表示通过浏览器访问这些文件的URL前缀。
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
二、建表
为了保存上传的文件,我们需要在项目中定义一个文件模型。在models.py文件中进行定义。此处以保存图片文件为例:
class Image(models.Model):
image = models.ImageField(upload_to='images/')
def __str__(self):
return f'{self.id}'
其中的 upload_to 参数用于设置文件存储的子目录。如果你不需要对文件进行二次分类,则可以直接写为 upload_to='/'
三、使用表单进行上传
在模板文件中编写文件上传表单。
<form method="POST" enctype="multipart/form-data" action="{% url 'upload' %}">
{% csrf_token %}
<input type="file" name="image">
<input type="submit" value="上传">
</form>
四、定义视图
使用Django自带的视图函数进行文件上传处理。首先需要引用两个库:from django.shortcuts import render 和 from django.conf import settings
然后可以定义一个新的视图函数进行文件上传处理:
def upload(request):
if request.method == 'POST':
image = request.FILES.get('image')
if image:
new_image = Image()
new_image.image = image
new_image.save()
return HttpResponse('文件上传成功!')
else:
return render(request, 'upload.html')
五、渲染结果
在模板文件中渲染上传结果。以下代码用于展示上传成功的图片:
<div>
{% for img in images %}
<img src="{{ img.image.url }}" height="300" />
{% endfor %}
</div>
六、完整代码示例
# settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
# models.py
class Image(models.Model):
image = models.ImageField(upload_to='images/')
def __str__(self):
return f'{self.id}'
# upload.html
<form method="POST" enctype="multipart/form-data" action="{% url 'upload' %}">
{% csrf_token %}
<input type="file" name="image">
<input type="submit" value="上传">
</form>
<div>
{% for img in images %}
<img src="{{ img.image.url }}" height="300" />
{% endfor %}
</div>
# views.py
from django.shortcuts import render
from django.conf import settings
from .models import Image
from django.http import HttpResponse
def upload(request):
if request.method == 'POST':
image = request.FILES.get('image')
if image:
new_image = Image()
new_image.image = image
new_image.save()
return HttpResponse('文件上传成功!')
else:
images = Image.objects.all()
return render(request, 'upload.html', {'images': images})