如何在Django项目中设置文件上传的大小与类型限制?
在Django中设置文件上传的类型与大小限制
一、文件类型限制
你可以通过两种方式限制上传文件的类型:
方法1:表单自定义验证逻辑
修改forms.py,添加文件类型校验:
# forms.py from django import forms from django.core.exceptions import ValidationError from .models import Document # 定义允许的文件扩展名 def validate_file_type(value): allowed_extensions = ['pdf', 'doc', 'docx', 'jpg', 'png'] file_ext = value.name.split('.')[-1].lower() if file_ext not in allowed_extensions: raise ValidationError(f"仅支持上传以下类型文件:{', '.join(allowed_extensions)}") class documentForm(forms.ModelForm): class Meta: model = Document fields = '__all__' def clean_Fichier(self): file = self.cleaned_data.get('Fichier') if file: validate_file_type(file) return file
方法2:给模型字段添加验证器
直接在models.py的FileField上绑定验证规则:
# models.py from django.db import models from django.core.validators import FileExtensionValidator class Document(models.Model): emp = models.ForeignKey(Emp, null=True, on_delete=models.SET_NULL) Description = models.CharField(max_length=100, null=True) Fichier = models.FileField( upload_to='file/', # 指定允许的文件扩展名 validators=[FileExtensionValidator(allowed_extensions=['pdf', 'doc', 'docx', 'jpg', 'png'])] ) data_created = models.DateTimeField(auto_now_add=True, null=True)
二、文件大小限制
大小限制分为表单单独校验和全局配置两种方式:
方法1:表单内限制单文件大小
修改forms.py,添加大小校验逻辑:
# forms.py from django import forms from django.core.exceptions import ValidationError from .models import Document def validate_file_size(value): # 设置最大允许5MB(单位:字节) max_size = 5 * 1024 * 1024 if value.size > max_size: raise ValidationError(f"文件大小不能超过{max_size//(1024*1024)}MB") class documentForm(forms.ModelForm): class Meta: model = Document fields = '__all__' def clean_Fichier(self): file = self.cleaned_data.get('Fichier') if file: validate_file_size(file) return file
方法2:全局配置所有上传文件的大小
在项目的settings.py中添加全局限制:
# settings.py # 单文件最大上传大小(5MB) MAX_UPLOAD_SIZE = 5 * 1024 * 1024 # Django默认内存中处理的文件大小上限,需大于MAX_UPLOAD_SIZE DATA_UPLOAD_MAX_MEMORY_SIZE = 10 * 1024 * 1024 # 临时文件存储的大小上限 FILE_UPLOAD_MAX_MEMORY_SIZE = 10 * 1024 * 1024
之后可以在表单校验中直接调用这个全局变量,方便统一修改。
三、同时限制类型和大小的完整表单示例
把两种校验结合起来:
# forms.py from django import forms from django.core.exceptions import ValidationError from django.conf import settings from .models import Document def validate_file_type(value): allowed_extensions = ['pdf', 'doc', 'docx', 'jpg', 'png'] file_ext = value.name.split('.')[-1].lower() if file_ext not in allowed_extensions: raise ValidationError(f"仅支持上传以下类型文件:{', '.join(allowed_extensions)}") def validate_file_size(value): if value.size > settings.MAX_UPLOAD_SIZE: raise ValidationError(f"文件大小不能超过{settings.MAX_UPLOAD_SIZE//(1024*1024)}MB") class documentForm(forms.ModelForm): class Meta: model = Document fields = '__all__' def clean_Fichier(self): file = self.cleaned_data.get('Fichier') if file: validate_file_type(file) validate_file_size(file) return file
四、模板中显示错误提示
你的视图逻辑不需要修改,当表单验证失败时,在document_form.html中添加错误展示即可:
{% if forms.errors %} <div class="alert alert-danger"> {% for field in forms %} {% for error in field.errors %} <p>{{ error }}</p> {% endfor %} {% endfor %} </div> {% endif %}
内容的提问来源于stack exchange,提问作者Robin Langlois
相关产品推荐
相关产品推荐

