您的位置:

Django文件上传完整教程

一、设置路径

首先,在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})