在Django中验证旧版巴西与Mercosur车牌格式的问题
解决方案:兼容旧版与Mercosur格式的巴西车牌验证
你的问题核心是现有正则表达式的第二个分支完全不符合Mercosur车牌的规则,以下是针对性修正方案:
1. 修正正则表达式
Mercosur格式车牌结构为3大写字母 + 1数字 + 1大写字母 + 2数字(如ABC1A35或带连字符的ABC-1A35),旧版格式为3大写字母 + 4数字(如ABC1234或ABC-1234)。替换原正则为兼容两种格式的版本:
placa_regex = r'^[A-Z]{3}-?([0-9]{4}|[0-9][A-Z][0-9]{2})$'
正则规则说明:
^[A-Z]{3}:匹配开头3个大写字母-?:兼容可选的连字符(支持带/不带连字符的输入)([0-9]{4}|[0-9][A-Z][0-9]{2}):双分支匹配,要么是4位数字(旧版),要么是「数字+大写字母+2位数字」(Mercosur)$:匹配字符串结尾,确保无多余字符
2. 修正后的验证函数
from django.core.exceptions import ValidationError from django.core.validators import RegexValidator def validate_placa(placa): """ Valida se a placa do veículo está no formato correto (padrão antigo ou Mercosul). Args: placa (str): A placa do veículo a ser validada. Returns: None se a placa for válida, uma mensagem de erro se não for. """ placa_regex = r'^[A-Z]{3}-?([0-9]{4}|[0-9][A-Z][0-9]{2})$' validator = RegexValidator( regex=placa_regex, message='Placa inválida. Use o formato ABC1234 (antigo) ou ABC1A35 (Mercosul), com ou sem traço.' ) try: validator(placa) except ValidationError as error: return error.message
3. 表单优化(可选)
为增强兼容性,可在验证前将输入转为大写并去除首尾空格,避免大小写或空格导致的验证失败:
class ClienteForm(forms.ModelForm): class Meta: model = Cliente fields = '__all__' veiculo_placa = forms.CharField( validators=[validate_placa], max_length=8, error_messages={'required': 'Placa é obrigatória.'} ) def validate_data(self, data): cleaned_data = super().validate_data(data) veiculo_placas = self.data.getlist('veiculo_placa') for placa in veiculo_placas: # 标准化输入:转大写+去首尾空格 normalized_placa = placa.strip().upper() error_message = validate_placa(normalized_placa) if error_message: self.add_error('veiculo_placa', error_message) return cleaned_data
内容的提问来源于stack exchange,提问作者Jonatas Pereira
相关产品推荐
相关产品推荐

