Django slugfield的"数字,字母,下划线和连字符"似乎没有被强制执行



我有一个如下的模型:

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')

最新更新