Трясогузка, как проверить PageChooserBlock возвращает правильно набранную страницу?

так что в моей компании мы недавно столкнулись с проблемой. У нас есть пользовательский StructBlock, содержащий в качестве первого атрибута PageChooserBlock.

page = blocks.PageChooserBlock(required=False)

В блоке StructBlock мы вызываем render():

def render(self, value, context=None):
    target_page = value['page'].basepage or context.get('page')
    if target_page is not None:
        context = context or {}
        context['new_value'] = target_page.CUSTOM_METHOD_DEFINED_IN_BASEPAGE()
    return super(CustomStructBlock, self).render(value, context)

Теперь проблема заключалась в том, что тип значения[‘page’] был не фактической выбранной страницей, а связанным объектом из модели страницы wagtailcore.
У этого не было нашего пользовательского метода, и после выяснения, что мы можем добавить «.basepage», чтобы вернуть исходную страницу,
теперь мы хотим проверить, что это будет продолжать работать.

Любая помощь о том, как проверить это было бы очень ценно 🙂

1 ответ

  1. Я предполагаюBasePage, что модель страницы определена где-то в вашем проекте? Стандартный способ перехода от Pageэкземпляра wagtailcore к правильно набранному объекту page являетсяpage.specific, но page.basepageтакже будет работать, если вы знаете, что ваша страница является экземпляром BasePage.

    Начиная с Wagtail 1.8, PageChooserBlock поддерживает target_modelпараметр:

    page = blocks.PageChooserBlock(required=False, target_model=BasePage)
    

    Это ограничивает выбор страниц, так что вы можете выбирать только страницы, которые являются экземплярами BasePage(или подклассом), а также гарантирует, что страница возвращается как BasePageэкземпляр, а не просто wagtailcore Page.