如何重写Django ImageField的max_length错误提示信息
问题根因
Django 2.2 中ImageField继承自FileField,它的文件名长度校验是字段初始化时内部单独挂载的MaxLengthValidator处理的,优先级高于你在error_messages参数里定义的max_length规则,所以直接配置error_messages不会生效,并非你的操作有误。
解决方法
有两种适配不同场景的方案可选:
方案1:单字段自定义校验(改动最小)
适合仅当前字段需要修改错误提示的场景,新增自定义文件名长度校验器,把错误提示写在校验逻辑里即可,代码调整如下:
from django.core.exceptions import ValidationError # 自定义文件名长度校验规则 def validate_filename_length(value): if len(value.name) > 150: # 这里直接写你需要的自定义错误提示即可 raise ValidationError("This is a test 1") class PageTemplate(models.Model): background_image = models.ImageField( blank=True, null=True, verbose_name='Header Image', upload_to=page_template_image_path, max_length=150, # 移除原来error_messages里的max_length配置,把自定义校验加入校验器列表 validators=(validate_image_file_extension, validate_filename_size, validate_filename_length), )
该方案仅修改当前字段的校验逻辑,不需要调整数据库结构,修改后无需执行migrate操作直接生效。
方案2:自定义字段类(全局通用)
如果项目里多个ImageField都需要统一修改max_length的错误提示,可以自定义字段子类覆写默认错误信息:
from django.db import models class CustomImageField(models.ImageField): # 覆写默认错误消息 default_error_messages = { 'max_length': "This is a test 1", # 也可以在这里修改其他内置错误的提示文本 } class PageTemplate(models.Model): # 直接使用自定义的字段类即可 background_image = CustomImageField( blank=True, null=True, verbose_name='Header Image', upload_to=page_template_image_path, max_length=150, validators=(validate_image_file_extension, validate_filename_size), )
内容的提问来源于stack exchange,提问作者Rayhan Muktader
相关产品推荐
相关产品推荐

