Django表单错误消息,例如“请填写此字段”,用于字段验证

时间:2018-08-15 15:54:40

标签: python django

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

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

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

enter image description here

感谢您的帮助!

编辑

在阅读吉列尔莫的回答后,我意识到“必需”错误消息未连接到模型验证器。有没有一种方法可以将模型验证器连接到前端错误消息,以使用户不必提交表单即可接收消息?

3 个答案:

答案 0 :(得分:1)

因为您没有使用

配置该字段
blank= True

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

这是一个 required 字段,因此按原样呈现在模板中,因此浏览器要求将其填充。

您必须添加属性:

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

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

答案 1 :(得分:1)

Django有一个名为phone的特殊程序包,用于输入电话号码。要安装,可以使用。
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')                                              

答案 2 :(得分:1)

要真正解决您的错误,请将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')