Django:使用正则表达式检查表单中的 CharField 格式

Posted

技术标签:

【中文标题】Django:使用正则表达式检查表单中的 CharField 格式【英文标题】:Django: Checking CharField format in form with a regular expression 【发布时间】:2015-10-20 17:15:46 【问题描述】:
class CapaForm(forms.Form):
    capa = forms.CharField(required=False)

提交表单后,我想检查capa 字段的格式。我想要求用户正确输入 6 个数字、一个破折号和两个数字的 capa 格式。 (######-##)

def search(self):
    capa = self.cleaned_data.get('capa', None)

    if ("\d6\-\d2" or None) not in capa:
            raise forms.ValidationError("CAPA format needs to be ######-##!")

目前不允许我提交格式正确的 capa 并引发 ValidationError。我认为问题在于我正在尝试将正则表达式与对象进行比较。如何检查用户尝试提交的“capa”格式?

*********更新

现在一切正常,除了我在 CAPA 字段中输入错误的格式。我收到错误The view incidents.views.index didn't return an HttpResponse object. It returned None instead. 这与我所做的更改有关吗?

from django.core.validators import RegexValidator
my_validator = RegexValidator("\d6\-\d2", "CAPA format needs to be ######-##.")

class CapaForm(forms.Form):
    capa = forms.CharField(
        label="CAPA",
        required=False, # Note: validators are not run against empty fields
        validators=[my_validator]
        )

def search(self):
    capa = self.cleaned_data.get('capa', None)
    query = Incident.objects.all()
    if capa is not '':
            query = query.filter(capa=capa)
    return(query)

【问题讨论】:

【参考方案1】:

首先你需要一个正则表达式验证器: Django validators / regex validator

然后,将其添加到您的字段的验证器列表中: using validators in forms

下面的简单示例:

from django.core.validators import RegexValidator
my_validator = RegexValidator(r"A", "Your string should contain letter A in it.")

class MyForm(forms.Form):

    subject = forms.CharField(
        label="Test field",
        required=True,  # Note: validators are not run against empty fields
        validators=[my_validator]
    )

【讨论】:

【参考方案2】:

您也可以从表单的两个部分询问,这对用户来说会更干净:

class CapaForm(forms.Form):
capa1 = forms.IntegerField(max_value=9999, required=False)
capa2 = forms.IntegerField(max_value=99, required=False)

然后加入他们的视野:

capa = self.cleaned_data.get('capa1', None) + '-' + self.cleaned_data.get('capa2', None)

【讨论】:

【参考方案3】:

您也可以使用RegexField。它与CharField 相同,但带有附加参数regex。 Under the hood 它使用验证器。

例子:

class MyForm(forms.Form):
    field1 = forms.RegexField(regex=re.compile(r'\d6\-\d2'))

【讨论】:

【参考方案4】:

正则表达式验证器在 Django 2.2 中对我不起作用

为字段值设置自定义验证的步骤:

    定义验证函数:

    def number_code_validator(value):
        if not re.compile(r'^\d10$').match(value):
            raise ValidationError('Enter Number Correctly')
    

    在表单中将定义的函数添加到字段的验证器数组中:

    number= forms.CharField(label="Number", 
                            widget=TextInput(attrs='type': 'number'),
                            validators=[number_code_validator])
    

【讨论】:

以上是关于Django:使用正则表达式检查表单中的 CharField 格式的主要内容,如果未能解决你的问题,请参考以下文章

django 表单验证

React 电子邮件验证中的正则表达式

ajax和jQuery同时操作唯一效验和正则表达式

Django中常用的正则表达式

如何使用 PHP 和正则表达式检查输入值是不是正确? [复制]

第10章 正则表达式