我有一张桌子,看起来像是:
class Tld(models.Model):
domainNm = models.CharField(validators=[ RegexValidator('^[0-9]^[a-z]','yourdomain.com only','Invalid Entry')], max_length=40)
dtCreated = models.DateField()
for domainNm - 我想对任何看起来像这样的条目进行验证:
必须遵循以下方式:<domainname>.[com|biz|net]
等,并且是字母数字。
如何在django模型的模型级别上执行此操作?
由于
答案 0 :(得分:11)
如果您要验证HTTP网址,请忘记正则表达式并使用builtin validator。
如果您只想要没有任何协议的域名,请尝试:
def full_domain_validator(hostname):
"""
Fully validates a domain name as compilant with the standard rules:
- Composed of series of labels concatenated with dots, as are all domain names.
- Each label must be between 1 and 63 characters long.
- The entire hostname (including the delimiting dots) has a maximum of 255 characters.
- Only characters 'a' through 'z' (in a case-insensitive manner), the digits '0' through '9'.
- Labels can't start or end with a hyphen.
"""
HOSTNAME_LABEL_PATTERN = re.compile("(?!-)[A-Z\d-]+(?<!-)$", re.IGNORECASE)
if not hostname:
return
if len(hostname) > 255:
raise ValidationError(_("The domain name cannot be composed of more than 255 characters."))
if hostname[-1:] == ".":
hostname = hostname[:-1] # strip exactly one dot from the right, if present
for label in hostname.split("."):
if len(label) > 63:
raise ValidationError(
_("The label '%(label)s' is too long (maximum is 63 characters).") % {'label': label})
if not HOSTNAME_LABEL_PATTERN.match(label):
raise ValidationError(_("Unallowed characters in label '%(label)s'.") % {'label': label})
<强>用法:强>
from django.core.validators import URLValidator
field = models.CharField(_('host name'), max_length=255, validators=[URLValidator])
或
field = models.CharField(_('host name'), max_length=255, validators=[full_domain_validator])
答案 1 :(得分:3)
回顾上述说明:您希望仅匹配具有单个字母数字标签的域和最多4个字符的TLD,例如。 “domain.com”或“someotherdomain.info”或“345xyz.pdq1”但不是“subdomain.domain.com”,“http://domain.com”,“www.domain.com”或“345xyz.abcde”。这个正则表达式将会这样做:
^[a-z0-9]+\.[a-z0-9]{1,4}$