思路是方向,代码是时间,知识需积累,经验需摸索。希望对大家有用,有错误还望指出。
要实现一个文件上传和下载的页面,我们需要涉及到 Django 中的以下几个概念/类/函数:
- models.Model:定义数据库模型,存储文件信息;
- forms.ModelForm:定义文件上传表单,用于提交文件到后端处理;
- views.View:处理上传、下载的逻辑;
- HttpResponse:返回下载的文件;
- FileField:Django 中的文件上传字段;
- FileResponse:返回文件的 HTTP 响应对象。
一、在 models.py 文件中定义一个 File 模型,用于存储上传的文件和文件相关信息。
from django.db import models
class File(models.Model):
filename = models.CharField(max_length=100)
file = models.FileField(upload_to='uploads/')
created_at = models.DateTimeField(auto_now_add=True)
代码中定义了一个名为 File 的模型,包含了文件名、文件、创建时间三个字段,并规定文件上传到 uploads/ 文件夹下。
二、在 forms.py 文件中,定义一个 FileForm 表单,用于提交文件到后端处理。
from django import forms
from .models import File
class FileForm(forms.ModelForm):
class Meta:
model = File
fields = ['filename', 'file']
代码中定义了一个名为 FileForm 的表单类,它继承自 Django 的 ModelForm,并以 File 模型为模板。fields 属性定义了需要提交的字段。class Meta: model = File fields = ['filename', 'file']
三、在 views.py 文件中,定义处理文件上传和下载的视图函数。
from django.shortcuts import render, redirect
from django.http import FileResponse
from django.views import View
from .models import File
from .forms import FileForm
class FileView(View):
def get(self, request):
files = File.objects.all().order_by('-created_at')
form = FileForm()
return render(request, 'files.html', {'files': files, 'form': form})
def post(self, request):
form = FileForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('file_list')
else:
return render(request, 'files.html', {'form': form})
class FileDownloadView(View):
def get(self, request, file_id):
file = File.objects.get(pk=file_id)
response = FileResponse(open(file.file.path, 'rb'))
response['Content-Disposition'] = 'attachment; filename=' + file.filename
return response
代码中定义了两个视图函数,一个用于显示上传文件列表和提交表单,一个用于下载文件。其中 FileView 用于处理 GET 和 POST 请求,并加载模板 files.html;FileDownloadView 用于下载文件,将文件二进制数据返回给客户端。
四、定义前端模板,在 templates 目录下创建名为 files.html 的模板文件,用于显示上传文件列表和提交表单。
<h2>Upload File</h2> *****上传******
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Upload</button> </form>
<h2>Download Files</h2> *****下载*****
<ul>
{% for file in files %}
<li><a href="{% url 'file_download' file.id %}">{{ file.filename }}</a></li>
{% empty %}
<li>No files found.</li>
{% endfor %} </ul>
代码中用 html 的 form 标签以及 Django 的 csrf_token 安全验证提供了上传文件的表单。展示已上传的文件,通过从 model 中获取数据生成文件列表。
以上是一个实现文件上传和下载的基本示例,它涉及到了 Django 中的一系列概念、类和函数,其中包括两个关键的视图函数,即处理文件上传的 FileView,以及处理文件下载的 FileDownloadView。这两个视图函数实现了对于文件的上传、下载、展示。前端通过 html 文件上传的表单 形式 提交数据,后端通过 models.Model 和 forms.ModelForm 等定义实现数据存储和数据处理。最终,前端通过 FileResponse 实现文件下载。