0

我正在为一个项目使用Wagtail CMS。我能够创建条目并毫无问题地更新它们。

我已将 slug 字段从提升面板移到我的内容面板中。这就是我的models.py样子:

# models.py

...
content_panels = Page.content_panels + [
    FieldPanel('slug'),
    ...
]

promote_panels = []

创建新条目时,我让 Wagtail 填充 slug 字段。例如,

  • 标题:Birthdays
  • 蛞蝓:birthdays

我能够输入所有字段并成功保存条目。

当我创建一个具有相同标题的条目时,我收到一个错误(保存时),slug 必须是唯一的。

ValidationError: {'slug': ['This slug is already in use']}

这是有道理的,蛞蝓必须是独一无二的——但是,我想让 Wagtail 为我处理这个问题?我想使用“生日”的相同页面标题。

是否有可能让 Wagtail 捕获异常并将-1等附加-2到 slug 而不会引发错误?

我来自CraftCMS,这就是创作经验的工作方式......

4

2 回答 2

0

这是我发现效果很好的方法。请让我知道,因为我确信可能有更好、更有效的方法。

# forms.py

from django.utils.text import slugify

...

class MyClass((WagtailAdminPageForm):
    cleaned_data = super(WagtailAdminPageForm, self).clean()

    # Ensure a unique slug for each entry
    if not self.instance.slug:
        cleaned_data['slug'] = slugify(f'{cleaned_data.get("title")} {Page.objects.filter(slug__startswith=cleaned_data.get("slug")).count()}')

    return cleaned_data

保存具有相同标题的条目时,我不再收到验证错误。结果,我的蛞蝓看起来像这样:

例子:

  • birthdays
  • birthdays-1
  • birthdays-2
  • birthdays-3(等等)

我将 slug 字段留在管理面板中,以便作者可以相应地更改它们。

于 2021-09-01T19:44:05.387 回答
0

Wagtail 有一个find_available_slug用于此目的的方法,尽管它没有被记录并且仅供 Wagtail 自己使用,因此在未来的版本中可能会在没有警告的情况下将其删除:

from wagtail.core.utils import find_available_slug

page.slug = find_available_slug('birthdays', parent_page)
于 2021-09-01T20:52:16.233 回答