📅  最后修改于: 2023-12-03 15:30:45.674000             🧑  作者: Mango
在 Django 中, FileField 是用于创建文件上传表单的一种表单字段类型。 它可以将文件上传到服务器上的指定目录中,并将文件路径存储到数据库中。
在 Django 表单中使用 FileField 需要以下步骤:
from django import forms
from django.core.files.storage import FileSystemStorage
from django.core.validators import FileExtensionValidator
class DocumentForm(forms.Form):
file = forms.FileField(validators=[FileExtensionValidator(['pdf', 'doc', 'docx', 'txt'])])
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Upload</button>
</form>
from django.shortcuts import render, redirect
from .forms import DocumentForm
def upload(request):
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
file = request.FILES['file']
fs = FileSystemStorage()
filename = fs.save(file.name, file)
file_url = fs.url(filename)
return render(request, 'upload.html', {'form': form, 'file_url': file_url})
else:
form = DocumentForm()
return render(request, 'upload.html', {'form': form})
FileField 可以接受的参数如下:
max_length: 文件路径的最大长度,默认为 100。
upload_to: 文件上传后保存的相对路径。可以是字符串或函数,以动态生成文件路径。
class UploadFileForm(forms.Form):
file = forms.FileField()
upload_to = 'uploads/%Y/%m/%d/'
def save(self):
file = self.cleaned_data['file']
filename = os.path.join(settings.MEDIA_ROOT, strftime(self.upload_to) + file.name)
with open(filename, 'wb+') as destination:
for chunk in file.chunks():
destination.write(chunk)
在 form 标签中添加 enctype="multipart/form-data"
,否则会导致表单无法接收上传的文件。
默认情况下, Django 不会为上传的文件生成新的文件名,因此需要手动创建唯一的文件名。
默认情况下, Django 不会为所上传的文件创建目录。如果要将文件上传到指定目录,需要手动创建目录。
FileField 是 Django 表单中用于上传文件的表单字段类型。它简化了文件上传和保存的过程,使得开发者可以更轻松地处理文件上传功能。要使用它,只需要在 Django 表单中添加 FileField 字段和相应的视图处理程序即可。