我有一个电话字段的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”错误消息与模型验证器无关。有没有一种方法可以将模型验证器连接到前端错误消息,这样用户就不必提交表单来接收消息了?
4条答案
按热度按时间j2cgzkjk1#
由于您没有使用
https://docs.djangoproject.com/es/2.1/ref/models/fields/#blank
这是一个 * 必填 * 字段,因此它在模板中呈现为,所以浏览器要求它被填充。
你必须添加属性:
你也可以不为正则表达式创建一个字段,而是创建一个带有函数的库,这样你就可以在其他模型上重用它。
编辑:
验证器不应该出现在模型定义中,因为它是表的表示,而正则表达式字段不是表的字段。
您可以创建一个带有
__init__.py
的文件夹,以便可以从您的应用程序调用它在
myvalidators.py
中,您可以使用所需的验证来创建函数或常量:myvalidators.py
在您的模型中,然后使用
RegexValidator
添加验证模式通过这种方法,您可以在任何应用程序或项目上重用正则表达式,以及在必须以相同方式验证的不同字段中重用正则表达式。
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)
在此之后,您将能够使用验证器
xeufq47z3#
要真正解决错误,请将
Proveedor
类替换为0dxa2lsx4#
Django有一个特殊的软件包叫做phone field,用于输入电话号码。要安装,您可以使用。
pip install django-phone-field
然后将
'phone_field'
添加到INSTALLED_APPS
设置中。并将其配置为