You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 03:52:03