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 格式的主要内容,如果未能解决你的问题,请参考以下文章