如何在Wagtail CMS中为自动生成的slug追加索引编号避免重复报错
解决方案
你可以通过重写页面模型的clean方法实现自动给重复slug追加序号的需求,Wagtail本身已经内置了对应逻辑的实现,不需要自己手动做复杂的重复判断。
简化实现(调用Wagtail内置方法)
直接调用Page类自带的_get_autogenerated_slug方法即可,该方法原生支持自动生成带-1、-2后缀的唯一slug,修改你的models.py代码如下:
# models.py from django.utils.text import slugify from wagtail.models import Page from wagtail.admin.panels import FieldPanel # 替换成你自己的页面类名 class CustomPage(Page): # 你原本的字段定义 # ... content_panels = Page.content_panels + [ FieldPanel('slug'), # 你原本的其他字段面板 ... ] promote_panels = [] def clean(self): super().clean() # 仅当slug为默认自动生成的内容时才做自动处理,不会覆盖用户手动修改的slug base_slug = slugify(self.title) if not self.slug or self.slug == base_slug: # 自动生成同父页面下唯一的slug self.slug = self._get_autogenerated_slug(base_slug)
逻辑说明
- 该实现遵循Wagtail原生的slug唯一规则:仅校验同一父页面下的slug唯一性,不同父页面下允许出现相同slug
- 不会覆盖用户手动自定义的slug,只有当slug为从标题自动生成的默认值时才会触发自动追加序号的逻辑
- 如果需要全局唯一的slug,可自行修改
_get_autogenerated_slug的查询范围,或者手动实现全表查询逻辑
中文slug适配
如果你的页面标题包含中文,需要先安装中文slug支持依赖:
pip install python-slugify[unicode]
之后替换代码中的slugify导入即可:
from slugify import slugify
内容的提问来源于stack exchange,提问作者Damon
相关产品推荐
相关产品推荐

