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

时间:2011-06-22 11:24:36

标签: django validation django-nonrel

我有一个如下模型:

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是否应该根据文档验证其输入,还是我自己需要这样做?当我似乎能够如此轻易地避免它时,为什么文档说明了限制?

1 个答案:

答案 0 :(得分:2)

SlugField的验证通过匹配forms.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')