注:请不要认为这是重复的职位,所有现有的职位是没有给SlugField明确的理解。
我的问题是“我们可以在CharField中存储值,对吗?”那么为什么我们需要SlugField来完成一些可以使用CharField轻松完成的事情呢?“
例如,在我的模型中,我有一个名为
url = models.CharField(max_length=30)
def save(self, ...):
self.url = slugify(self.url)
.......
字符串
URL不会以slugified格式保存在数据库中吗?我可以在浏览器中使用这个slugified值的权利,那么创建模型有什么用。SlugField(max_length=30)?SlugField比slugified CharField有什么优势?
在上面的代码中,用“SlugField”替换“CharField”有什么好处?
1条答案
按热度按时间kiayqfof1#
我们可以
slugify
并将值存储在CharField中,对吗?那么为什么我们需要SlugField来完成一些可以使用CharField
轻松完成的事情呢?一个
SlugField
是一个CharField
,但一个特殊的CharField
。这是一个包含 validator 的字段,如果您通过表单输入数据,则该字段将验证输入的字符串是否确实是slug。例如,slug不包含空格,所以如果您在表单中使用SlugField
,这样作者可以自己指定slug,它将拒绝这样的slug。默认使用**
django.core.validators.validate_slug
验证器[GitHub]。SlugField
有一个额外的参数allow_unicode
。如果设置为True
,它将使用django.core.validators.validate_unicode_slug
验证器[GitHub]。因此,本质上它确实是一个
CharField
,但具有由allow_unicode=…
参数[Django-doc]确定的验证器。这因此使其更方便。通常,您不希望slugify slug字段本身的内容,而是从另一个字段,例如博客文章条目的标题。因此,您仍然希望保留标题,但创建一个slugified变体。
django-autoslug
package [readthedocs]提供了一个**AutoSlugField
**[readthedocs],这更方便,因为你可以定义如何填充字段,因此它会自动slugify:字符串