首页 > 解决方案 > 覆盖 Wagtail Page.get_url()?

问题描述

为了尝试仅将 WagtailPage树用于导航结构,我声明了以下内容,以便可以根据需要呈现链接而不是页面 url:

class Node(Page):
  
    class Meta:
        verbose_name = 'Node (no content or link)'

    link = models.CharField(max_length=255, default='', blank='True', help_text='Optional.  Leave blank if serving as a parent page')

    content_panels = Page.content_panels + [
        FieldPanel('link')
    ]

    def get_url(self, **kwargs):
        if self.link != '':
            return self.link
        else:
            return super().get_url(self, **kwargs)

在模板中,我已经尝试了这两种方法{{ item.url }},以及正在迭代的页面树中的项目在{{ item.specific.url }}哪里。itemWagtail 函数定义的项目 urlPage.get_url()总是被渲染,def get_url()我定义的永远不会被执行。

我知道 Wagtail Menus 但试图在这个项目中没有另一个依赖项,所以除了上述是否是最好的架构之外,我在让它工作时缺少什么?


为了在此处跟进,我已按照这些说明进行操作,并且在class Node(Page)模型上我现在有以下内容代替def get_url

def get_url_parts(self, *args, **kwargs):
    site_id, root_url, page_path = super().get_url_parts(*args, **kwargs)
    # return an alternative page_path if link has a value
    if self.link.strip() != '':
        page_path = self.link

    return site_id, root_url, page_path

我发现我仍然必须使用item.specific.get_url. item.url行不通。

标签: wagtail

解决方案


发生这种情况是因为urlPage 模型上的属性是由这行代码定义的

url = property(get_url)

即定义一个属性,该属性url包含对该get_url函数的调用,因为它在该行代码运行时存在——即,Page.get_url 的默认实现。即使您覆盖get_urlNode 模型,Node 模型的url属性仍将指向原始定义。

如果您url = property(get_url)在定义之后添加该行get_url,或者{{ item.specific.get_url }}直接在您的模板上调用,您应该希望看到所需的行为。

根据文档,get_url_parts如果您正在设置自定义 URL 方案,则建议使用覆盖方法,因为它包含所有 URL 访问器 ( url, get_url, full_url, relative_url) 共有的共享逻辑。


推荐阅读