首页 > 解决方案 > django 中的 SlugField 有什么用?

问题描述

注意:请不要认为它是重复的帖子,所有现有的帖子都不能清楚地了解 SlugField。

我的问题是“我们可以将值 sluggify 并将其存储在 CharField 中,对吧?那为什么我们需要 SlugField 来完成使用 CharField 可以轻松完成的事情?”

例如,在我的模型中,我有一个名为

url = models.CharField(max_length=30)
def save(self, ...):
    self.url = slugify(self.url)
    .......

网址不会以slugified格式保存在数据库中吗?我可以在浏览器中使用这个slugified值,那么创建models.SlugFIeld(max_length = 30)有什么用?SlugField 将比 slugified CharField 添加什么优势?

在上面的代码中,用“SlugField”替换“CharField”有什么好处?

标签: djangodjango-models

解决方案


我们可以slugify将值存储在 CharField 中,对吗?那么为什么我们需要 SlugField 来做一些可以轻松使用的事情CharField呢?

ASlugField是一个CharField,但是一个特殊的CharField。它是一个包含验证器的字段,例如,如果您通过表单输入数据,则验证输入的字符串是否确实是 slug。例如,slug 不包含空格,因此如果您SlugField在表单中使用 ,以便作者可以自己指定 slug,它将拒绝此类 slug。

默认情况下,它使用django.core.validators.validate_slug验证器 [GitHub]SlugField有一个额外的参数allow_unicode。如果设置为True,它将使用django.core.validators.validate_unicode_slug验证器 [GitHub]

所以本质上它确实是一个,但是有一个由**参数 [Django-doc]CharField确定的验证器。因此,这使其更加方便。allow_unicode=…

通常,您不想对 slug 字段本身的内容进行 slug 化,而是从另一个字段(例如博客文章条目的标题)。因此,您仍然希望保留标题,但制作一个 slugified 变体。

django-autoslug包 [readthedocs]提供了一个更方便的AutoSlugField[readthedocs],因为您可以定义如何填充该字段,因此它会自动 slugify:

from autoslug import AutoSlugField

class MyModel(models.Model):
    title = models.CharField(max_length=128)
    slug = AutoSlugField(populate_from='title')

推荐阅读