自定义WagtailAdminPageForm的save方法多次触发,如何仅在页面保存时执行一次?
Wagtail页面保存时自动生成字段的问题
需求
- 在Wagtail页面保存时,根据编辑器填写的字段自动生成另一个字段内容。
现有实现
按照Wagtail官方文档自定义WagtailAdminPageForm,在save方法中添加字段生成逻辑,代码如下:
from wagtail.models import Page from wagtail.admin.forms import WagtailAdminPageForm class TestPageForm(WagtailAdminPageForm): def clean(self): cleaned_data = super().clean() print("-> called TestPageForm.clean()") return cleaned_data def save(self, commit=True): print(f"1 {commit=}") page = super().save(commit=False) print(f"2 {commit=}") print("-> called TestPageForm.save()") # 处理逻辑,将结果保存到实例字段,例如: # page.pdf_cover_image = get_cover_image(self.cleaned_data["pdf"]) if commit: print(f"{commit=}: calling page.save()") page.save() return page class TestPage(Page): base_form_class = TestPageForm
遇到的问题
clean()和save()方法会被多次调用(包括页面加载、预览场景),且commit参数始终为False,无法区分是否为真正的页面保存操作,希望自定义保存操作仅在页面保存时执行一次。
日志情况
编辑页面时的调用记录
[10/May/2023 10:35:37] "GET /admin/pages/139/edit/ HTTP/1.1" 200 71082 [...assets...] -> called TestPageForm.clean() 1 commit=False 2 commit=False -> called TestPageForm.save() [10/May/2023 10:35:37] "GET /admin/pages/139/edit/preview/?in_preview_panel=true&mode= HTTP/1.1" 200 0 [10/May/2023 10:35:37] "DELETE /admin/pages/139/edit/preview/ HTTP/1.1" 200 17 -> called TestPageForm.clean() [10/May/2023 10:35:37] "POST /admin/pages/139/edit/preview/ HTTP/1.1" 200 40 -> called TestPageForm.clean() 1 commit=False -> called TestPageForm.clean() 2 commit=False -> called TestPageForm.save() 1 commit=False 2 commit=False -> called TestPageForm.save() [10/May/2023 10:35:37] "GET /admin/pages/139/edit/preview/?in_preview_panel=true&mode= HTTP/1.1" 200 0
保存页面时的调用记录
[10/May/2023 10:35:37] "GET /admin/pages/139/edit/preview/?in_preview_panel=true&mode= HTTP/1.1" 200 0 -> called TestPageForm.clean() 1 commit=False 2 commit=False -> called TestPageForm.save() [10/May/2023 10:38:10] "POST /admin/pages/139/edit/ HTTP/1.1" 302 0 [10/May/2023 10:38:10] "GET /admin/pages/8/ HTTP/1.1" 200 45356
内容的提问来源于stack exchange,提问作者tombreit
相关产品推荐
相关产品推荐

