代码之家  ›  专栏  ›  技术社区  ›  CCCodes

Django表单错误消息,如“请填写此字段”以进行字段验证

  •  0
  • CCCodes  · 技术社区  · 7 年前

    我有一个电话字段的regexvalidator。当我再次呈现表单时,它可以返回错误。但是,我注意到在尝试提交带有空白输入的表单时出现“请填写此字段”错误消息,这不会重新呈现表单以显示该消息。如何将此类消息用于自己的验证器?

    模型.py

    class Proveedor(models.Model):
        phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$',
                                     code='invalid_phone_number',
                                     message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
        telefono = models.CharField(max_length=15, validators=[phone_regex], verbose_name='Teléfono')
        telefono_de_representante = models.CharField(max_length=15,
                                                     validators=[phone_regex],
                                                     verbose_name='Teléfono de representante')
        ...
    

    py-我认为错误信息部分是一个潜在的解决方案,但它没有改变任何东西

    class ProveedorForm(BaseModelForm):
        class Meta:
            model = Proveedor
            fields = ('nombre', 'telefono', 'representante', 'telefono_de_representante', 'correo_electronico')
    
        def __init__(self, *args, **kwargs):
            super(ProveedorForm, self).__init__(*args, **kwargs)
            self.fields['telefono'].error_messages = {'invalid_phone_number': 'Phone number must be entered in the format: \'+999999999\'. Up to 15 digits allowed.'}
    

    views.py-我可以访问上一个呈现语句中的错误(如果表单无效),但这需要再次呈现页面

    def proveedores(request, error=None):
        if request.method == "POST":
            form = ProveedorForm(request.POST)
            if form.is_valid():
                form.save()
                return redirect('menu:proveedores')
            return render(request, 'menu/proveedores.html', {'form': form})
    

    如何为我的电话号码验证程序生成此类消息?

    enter image description here

    谢谢你的帮助!

    编辑

    在阅读了Guillermo的响应之后,我意识到“Required”错误消息没有连接到模型验证器。是否有方法将模型验证器连接到前端错误消息,这样用户就不必提交表单来接收消息?

    1 回复  |  直到 7 年前
        1
  •  1
  •   schrodingerscatcuriosity kmahankali    7 年前

    因为你没有用

    blank= True
    

    https://docs.djangoproject.com/es/2.1/ref/models/fields/#blank

    它是一个 必修的 字段,因此它在模板中按原样呈现,因此浏览器要求填充它。

    必须添加属性:

    telefono = models.CharField(
        max_length=15, 
        validators=[phone_regex], 
        verbose_name='Teléfono',
        blank=True
    )
    

    另外,您可以创建一个带有函数的库,而不是为regex创建一个字段,这样您就可以在其他模型上重用它。

    编辑:

    验证器不应该在模型定义中,因为它是表的表示,而regex字段不是表的字段。

    您可以使用 __init__.py 所以可以从你的应用程序调用它

    root_folder/
        myapp/
        myvalidators/
           __init__.py
           myvalidators.py
    

    myvalidators.py 使用所需的验证创建函数或常量:

    我的验证器.py

    REGEX_PATTERN_PHONE = your_regex
    MSG_PHONE_NOT_VALID = your_message
    

    然后在模型中添加验证模式 RegexValidator

    from myvalidators import myvalidators
    
    ...  
    telefono = models.CharField(
        max_length=15, 
        validators=[phone_regex], 
        verbose_name='Teléfono',
        blank=True,
        validators = [RegexValidator(myvalidators.REGEX_PATTERN_PHONE, myvalidators.MSG_PHONE_NOT_VALID)],
    )
    ...
    

    使用这种方法,您可以在任何应用程序或项目中重用regex,也可以在必须以相同方式验证的不同字段中重用regex。