【问题标题】:Django - Generate default slugDjango - 生成默认 slug
【发布时间】:2011-06-20 13:16:26
【问题描述】:

我想为我的模型生成一个随机 slug,但没有设置“blank=True”(因为我想稍后通过验证来强制执行它。)

我想知道我是否可以这样做:

slug = models.SlugField(unique=True, default=some_method(), verbose_name='URL Slug')

其中 some_method 是一种生成随机 slug 的方法?我已经尝试了上面的代码,但它不起作用:(

我想做的是生成一个独特的 slug (unique_slugify?)

【问题讨论】:

  • 这个在创建对象的时候调用方法,是不是故意的?
  • 是的,虽然它不起作用... NameError: name 'some_method' is not defined

标签: django django-models


【解决方案1】:

当您希望自动生成 slug 时,可以使用此选项,并在同一模型中的其他字段中输入条目,即 slug 所在的位置。

from django_extensions.db.fields import AutoSlugField

slug = AutoSlugField(_('slug'), max_length=50, unique=True, populate_from=('name',))
  • populate_from 是模型中将自动生成 slug 的字段

【讨论】:

【解决方案2】:

您可以覆盖模型保存方法,以便在创建新实体时即时生成 slug。比如:

if not self.pk:
    self.slug = ''.join(random.sample(string.ascii_lowercase, 10))

可以这样做,但这不是很好,最好让 slug 成为对象名称的确定性 slugified 版本。

【讨论】:

  • 我不介意如果是这种情况,我只是对如何将其设置为默认设置感到困惑。我没有使用管理面板
  • 随机字符串不利于唯一性,最好坚持使用摘要之类的东西(时间戳结合随机)
  • 谢谢。我不想覆盖保存方法,但它似乎是不可避免的。 Tommaso,如果你有一个例子来说明你的意思,我会很感激。
【解决方案3】:

default 必须是值或可调用对象。
所以它是default=some_method,而不是default=some_method()。这是一个例子:

from django.contrib.auth.models import UserManager

def randomString():
    um = UserManager()
    return( um.make_random_password( length=25 ) )

class Foo( models.Model ):
    code = models.CharField( max_length=25, default=randomString )

【讨论】:

  • 有趣,使用 random.random 不起作用我收到了 Cannot serialize function 错误,但这个自定义函数确实发生了。
  • 感谢您提出这个问题!它帮助了我!
【解决方案4】:

也许模型验证可以提供帮助? http://docs.djangoproject.com/en/dev/ref/models/instances/

您可以简单地验证应该写入 slug 字段中的值,如果它已经存在,则生成一些独特的东西。

也可以覆盖模型保存方法。

干杯。

【讨论】:

    【解决方案5】:

    在谷歌搜索,我发现了类似的问题:How to use slug in django

    我认为更好的方法是重写保存方法,并验证表单中的字段。

    但是,slug 应该是唯一的,所以生成随机字符串不好!就像 Tommaso Bardugi 早说的那样,如果你在 url 中添加时间戳,这个问题就解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-07
      • 2021-01-23
      • 2017-05-25
      • 2017-07-13
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多