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

ssm49v7z  于 2023-10-21  发布在  Go
关注(0)|答案(4)|浏览(148)

我有一个电话字段的RegexValidator。当我再次呈现表单时,它会返回错误。但是,我注意到在尝试提交带有空白输入的表单时出现了“Please fill out this field”错误消息,该消息不会重新呈现表单以显示该消息。我如何在我自己的验证器中使用这种类型的消息?
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我可以访问最后一个render语句中的错误(如果表单无效),但这需要再次渲染页面

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的回复后,我意识到“required”错误消息与模型验证器无关。有没有一种方法可以将模型验证器连接到前端错误消息,这样用户就不必提交表单来接收消息了?

j2cgzkjk

j2cgzkjk1#

由于您没有使用

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

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

hof1towb

hof1towb2#

这可能是浏览器的HTML问题。Why is Chrome showing a "Please Fill Out this Field" tooltip on empty fields?你也可以在Django视图中轻松地从html中删除这个“required”
form = NameForm(request.POST or None,use_required_attribute=False)
在此之后,您将能够使用验证器

xeufq47z

xeufq47z3#

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

0dxa2lsx4#

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

相关问题