1

我有一个如下模型:

class Page(ContentBase):    
    url_slug = models.SlugField()

根据 SlugField 文档,slugfields 是“数字、字母、下划线和连字符”。但是,我似乎能够设置具有超出该规范的字符的坏蛞蝓:

page = Page.objects.get(id=872)
page.url_slug = '&*()&*(*(Y*'    
page.save()

In [26]: page.url_slug
Out[26]: '&*()&*(*(Y*'

为什么是这样?SlugFields 是否应该根据文档验证其输入,还是我需要自己做?当我似乎能够如此轻松地避免限制时,为什么文档会说明限制?

4

1 回答 1

4

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')
于 2011-06-22T11:35:49.837 回答