我有一个如下的模型:
class Page(ContentBase):
url_slug = models.SlugField()
根据SlugField文档,SlugField是"数字、字母、下划线和连字符"。然而,我似乎能够设置坏的蛞蝓,这些蛞蝓的字符超出了这个规范:
page = Page.objects.get(id=872)
page.url_slug = '&*()&*(*(Y*'
page.save()
In [26]: page.url_slug
Out[26]: '&*()&*(*(Y*'
为什么会这样?SlugFields实际上应该根据文档验证其输入,还是我需要自己验证?当我似乎可以如此轻松地避免它时,为什么文档中会说明限制?
SlugField的验证通过其匹配的表单来工作。SlugField:
class SlugField(CharField):
default_error_messages = {
'invalid': _(u"Enter a valid 'slug' consisting of letters, numbers,"
u" underscores or hyphens."),
}
default_validators = [validators.validate_slug]
如果您在没有表单的情况下手动修改,请参阅django.core.validators.validate_slug:
slug_re = re.compile(r'^[-w]+$')
validate_slug = RegexValidator(slug_re, _(u"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."), 'invalid')