获取创建新 Wagtail 页面的父页面

Che*_*uis 5 python django wagtail

创建新页面时,我需要根据父页面的值更改某些字段默认值。编辑现有页面时,这不是问题,但创建新页面时,我需要为字段设置默认值。我曾尝试覆盖管理表单,在 WagtailAdminPageForm 初始化时,parent_page 参数为空。如果我尝试在 Page 子类的 init 方法中执行此操作,则父信息中没有 arg 或 kwargs。

有没有办法获取新页面将成为父页面的页面?

这是我在 Page 构造函数上尝试过的

class CMSPage(Page):
    .
    .
    .
    def __init__(self, *args, **kwargs):
        super(BaseContentMixin, self).__init__(*args, **kwargs)

        if hasattr(self.get_parent().specific, 'published_site') and self.get_parent().specific.published_site == 'extranet':
            self.published_site = 'extranet'
Run Code Online (Sandbox Code Playgroud)

这适用于编辑页面,对于新页面,我发现 NoneType 对象没有特定的属性。

Django 版本是 1.10,Python 版本是 3.6,Wagtail 版本是 1.9

LB *_*ton 4

澄清问题后,这是可能更合适的第二个答案。请注意,这需要 Wagtail 1.11.x,目前尚未发布。

解决方案的示例代码

首先为您的自定义页面表单创建一个新类,通常在 models.py 中或页面模型所在的任何位置。

from wagtail.wagtailadmin.forms import WagtailAdminPageForm

class MyCustomPageForm(WagtailAdminPageForm):

    # Override the __init__ function to update 'initial' form values
    def __init__(self, data=None, files=None, parent_page=None, *args, **kwargs):
        print('parent_page', parent_page, parent_page.id, parent_page.title)
        # update the kwargs BEFORE the init of the super form class
        instance = kwargs.get('instance')
        if not instance.id:
            # only update the initial value when creating a new page
            kwargs.update(initial={
                # 'field': 'value'
                'title': parent_page.id  # can be anything from the parent page
            })
        # Ensure you call the super class __init__
        super(MyCustomPageForm, self).__init__(data, files, *args, **kwargs)
        self.parent_page = parent_page
Run Code Online (Sandbox Code Playgroud)

第二在页面模型定义上,告诉该模型使用您定义的表单类

from wagtail.wagtailcore.models import Page

class MyCustomPage(Page):
    base_form_class = MyCustomPageForm
Run Code Online (Sandbox Code Playgroud)

解决方案说明

  • Wagtail 提供了重写在构建表单以在 Wagtail Admin 中创建和编辑时调用的表单类(注意:不是模型类)的功能。
  • 文档:自定义生成的表单
  • 我们的自定义表单类将继承该类WagtailAdminPageForm
  • 在这个新的表单类中,我们要定义自己的__init__函数,该函数在创建表单时调用。
  • 请注意WagtailAdminPageForm 上默认定义的Github 代码__init__
  • 要注入自定义值,我们将在调用类的 super 之前覆盖initial数据kwargs__init__
  • 我们只想在创建新页面时执行此操作,因此请检查实例是否没有id
  • 我们可以访问parent_page实例及其中的任何字段
  • __init__添加自定义初始数据后,我们使用更改后的 kwargs调用 super
  • 注意:要求 Wagtail 1.11.x 的原因是之前的版本在调用类模型时没有添加parent_page,直到拉取请求 3508