【问题标题】:Django Form Error Message Like "Please fill out this field" for Field Validation字段验证的 Django 表单错误消息,例如“请填写此字段”
【发布时间】:2018-08-15 15:54:40
【问题描述】:

我有一个电话字段的 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')
    ...

Forms.py - 我认为 error_messages 部分是一个潜在的解决方案,但它并没有改变任何东西

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})

如何为我的电话号码验证器发送此类消息?

感谢您的帮助!

编辑

阅读 Guillermo 的回复后,我意识到“必需”错误消息未连接到模型验证器。有没有办法将模型验证器连接到前端错误消息,这样用户就不必提交表单来接收消息?

【问题讨论】:

    标签: python django


    【解决方案1】:

    由于您没有使用

    配置该字段
    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
    )
    

    您也可以创建一个带有函数的库,而不是为正则表达式创建一个字段,这样您就可以在其他模型上重用它。

    编辑:

    验证器不应该出现在模型定义中,因为它是表的表示,而正则表达式字段不是表的字段。

    您可以使用__init__.py 创建一个文件夹,以便可以从您的应用程序中调用它

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

    myvalidators.py 中,您可以使用所需的验证创建函数或常量:

    myvalidators.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)],
    )
    ...
    

    通过这种方法,您可以在任何应用或项目中以及在必须以相同方式验证的不同领域中重复使用正则表达式。

    【讨论】:

    • 您好 Guillermo,感谢您的回答。我实际上喜欢它具有该错误消息,因为该字段应该是必需的,并且希望在我输入无效电话号码时也显示类似的错误消息。你是什​​么意思创建一个函数库?错误消息内置在 Django 表单视图中,但我不确定如何为我的 RegexValidator 访问它。
    • 我的问题不是如何重用验证器,而是我实际上想知道如何获取屏幕截图中显示的警告。将验证器放在另一个文件中似乎只会改变代码的结构。
    • @CCCodes 也许我误解了你的问题。警告是由浏览器发出的,因为该字段具有 required 属性。它将在所有必需的字段中以这种方式呈现,并且对于更多详细信息,它在每个浏览器上都会有所不同,甚至是语言。要更改行为,您必须在没有所需属性的情况下呈现字段,然后您的自定义验证器消息将出现。您也可以通过 javascript 实现这一点,因此您不必发送表单,我认为这在客户端部分更好,但始终具有服务器验证。
    • 这是有道理的。有什么方法可以将前端验证器连接到模型验证器?
    • @CCCodes 我不确定你的意思。您不能将客户端中的验证与服务器中的验证绑定。假设客户端验证、javascript 和一些 html 属性是“假”。它的作用是防止将错误的数据发送到服务器,但仅此而已。服务器总是必须执行它自己的 "real" 验证:如果在浏览器中停用,javascript 可能会失败,甚至完全不存在。您可以做的是“镜像”两个验证,更具体地说,客户端必须是服务器的镜像。
    【解决方案2】:

    要真正解决您的错误,请将您的 Proveedor 类替换为

    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', blank=true)
        telefono_de_representante = models.CharField(max_length=15,
                                                     validators=[phone_regex],
                                                     verbose_name='Teléfono de representante')
    

    【讨论】:

      【解决方案3】:

      Django 有一个特殊的包叫做 phone field 用于输入电话号码。要安装你可以使用。
      pip install django-phone-field
      然后将'phone_field' 添加到您的INSTALLED_APPS 设置中。

      并像这样配置它

      from phone_field import PhoneField
      
      class Proveedor(models.Model):
      telefono_de_representante = PhoneField(blank=True,verbose_name='Teléfono de representante')                                              
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 2020-10-15
        • 1970-01-01
        • 2018-01-29
        • 1970-01-01
        • 1970-01-01
        • 2022-12-30
        相关资源
        最近更新 更多