Django: list对象不能在forms.py中使用验证器和RegexValidator调用 &



我正在尝试添加RegexValidator验证器到联系人表单(forms.py),以防止垃圾邮件发送者在消息中添加http://https://链接。

我把from django.core.validators import RegexValidator放在forms.py的顶部。

当不使用验证器时,general_message的示例工作得很好:

general_message = forms.CharField(label='General message*', required=True, widget=forms.Textarea(
attrs={'class': 'form-control', 'maxlength': '1000', 'rows': 8}
))

但我得到错误'list’ object is not callable在下面的例子:

general_message = forms.CharField(label='General message*', required=True, widget=forms.Textarea, validators=[RegexValidator(regex=r'^(?!.*bhttps?b).+$', message="No http or https allowed", code="invalid")] (
attrs={'class': 'form-control', 'maxlength': '1000', 'rows': 8} ))

看来我的括号和圆括号是正确的。是什么导致了错误?

Python 3.9, Django 4.0.1


编辑4/20/22:Regex不匹配http://https://

首先,我建议使用TextField而不是CharField。一般CharField用于一小段文本,TextField用于大文本。

如果你坚持使用CharField,你应该格式化这长行代码,这样你就可以理解它的作用。例如:

general_message = forms.CharField(
label='General message*', 
required=True,
widget=forms.Textarea, 
validators=[
RegexValidator(
regex=r'http(s)?|HTTP(s)?',
message="No http or https allowed",
code="invalid"
)
]
(
attrs={
'class': 'form-control',
'maxlength': '1000',
'rows': 8
}
)
)

现在您看到validators[]后面有一个()。这看起来像一个函数调用。但这没有任何意义,因为你不能调用列表,如错误所示。

通过使用一致的格式和缩进,可以很容易地避免这类问题。我上面展示的格式是许多可以工作的样式之一。选择一件事并坚持下去。

要解决这个问题,您只需要移动代码,使其正确排列。看起来您将validators放在Textarea()之间的错误位置以调用其构造函数。正确的代码应该是这样的:

general_message = forms.CharField(
label='General message*', 
required=True,
widget=forms.Textarea(
attrs={
'class': 'form-control',
'maxlength': '1000',
'rows': 8
}
),
validators=[
RegexValidator(
regex=r'http(s)?|HTTP(s)?',
message="No http or https allowed",
code="invalid"
)
]
)

最新更新