python - 如何在 Django 中创建 slug?

我正在尝试在 Django 中创建一个 SlugField

我创建了这个简单的模型:

from django.db import models

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()

然后我这样做:

>>> from mysite.books.models import Test
>>> t=Test(q="aa a a a", s="b b b b")
>>> t.s
'b b b b'
>>> t.save()
>>> t.s
'b b b b'

我期待 b-b-b-b

最佳答案

您需要使用 slugify功能。

>>> from django.template.defaultfilters import slugify
>>> slugify("b b b b")
u'b-b-b-b'
>>>

您可以通过覆盖 save 方法自动调用 slugify:

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()
    
    def save(self, *args, **kwargs):
        self.s = slugify(self.q)
        super(Test, self).save(*args, **kwargs)

请注意,当编辑 q 字段时,上述内容会导致您的 URL 发生变化,即 can cause broken links .创建新对象时最好只生成一次 slug:

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()
    
    def save(self, *args, **kwargs):
        if not self.id:
            # Newly created object, so set slug
            self.s = slugify(self.q)

        super(Test, self).save(*args, **kwargs)

https://stackoverflow.com/questions/837828/

相关文章:

linux - 如何让 cp 命令创建任何必要的文件夹以将文件复制到目标

linux - 向进程组的所有成员发送信号的最佳方式是什么?

linux - 在 Linux 系统上快速创建大文件

python - 从第 2 行读取文件或跳过标题行

python - 我应该在 Python 中使用 "camel case"还是下划线?

python - 如何获取方法参数名称?

linux - 如果任何命令返回非零值,则中止 shell 脚本

linux - 如何从 shell 将一个文件 append 到 Linux 中的另一个文件?

linux - 使用 cURL 执行 HTTP 请求(使用 PROXY)

python - 如何将 SQLAlchemy 行对象转换为 Python 字典?