Django中SlugField的用途是什么?

4

注意:请不要把它看作重复的帖子,所有现有的帖子都没有清楚地解释SlugField。

我的问题是“我们可以使用CharField轻松地将值转换为slug并将其存储在其中吗?那么为什么需要SlugField?”

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

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

在数据库中,URL不会以slugified格式保存吗?我可以在浏览器中使用这个slugified值,那么创建models.SlugField(max_length=30)的作用是什么?相比于slugified CharField,SlugField有什么优势?

将"CharField"替换为"SlugField",有什么优点?

1个回答

8
我们可以使用CharField来进行slugify并存储值,那为什么我们需要SlugField呢?毕竟这个功能可以很容易地通过CharField实现。
SlugField是一个特殊的CharField。它包含一个验证器,如果你通过表单输入数据,它将验证输入的字符串是否确实是一个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]确定。因此,这使得它更加方便。

通常情况下,您不希望将slug字段本身的内容转换为slug形式,而是从另一个字段中获取,例如博客文章的标题。因此,您仍然想保留标题,但生成一个slug化的变体。 django-autoslug package [readthedocs]提供了一个更方便的AutoSlugField [readthedocs],因为您可以定义如何填充该字段,从而自动进行slug化处理。
from autoslug import AutoSlugField

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接