📜  FileField – Django 表单(1)

📅  最后修改于: 2023-12-03 15:30:45.674000             🧑  作者: Mango

FileField – Django 表单

简介

在 Django 中, FileField 是用于创建文件上传表单的一种表单字段类型。 它可以将文件上传到服务器上的指定目录中,并将文件路径存储到数据库中。

用法

在 Django 表单中使用 FileField 需要以下步骤:

  1. 在 forms.py 中导入 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'])])
  1. 在表单中使用 FileField
<form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Upload</button>
</form>
  1. 在视图中处理上传的文件
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)
  • validators: 一个由验证器组成的列表,用于验证上传文件的类型、大小等。
注意事项
  • 在 form 标签中添加 enctype="multipart/form-data",否则会导致表单无法接收上传的文件。

  • 默认情况下, Django 不会为上传的文件生成新的文件名,因此需要手动创建唯一的文件名。

  • 默认情况下, Django 不会为所上传的文件创建目录。如果要将文件上传到指定目录,需要手动创建目录。

结论

FileField 是 Django 表单中用于上传文件的表单字段类型。它简化了文件上传和保存的过程,使得开发者可以更轻松地处理文件上传功能。要使用它,只需要在 Django 表单中添加 FileField 字段和相应的视图处理程序即可。