【问题标题】:Override Wagtail Page.get_url()?覆盖 Wagtail Page.get_url()?
【发布时间】:2021-01-15 22:08:01
【问题描述】:

为了尝试只使用 Wagtail Page 树作为导航结构,我声明了以下内容,以便可以根据需要呈现链接而不是页面 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 }},其中item 是正在迭代的页面树中的一个项目。 Wagtail 的 Page.get_url() 函数定义的项目 url 总是被渲染,而我定义的 def get_url() 永远不会被执行。

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


为了跟进,我关注了these instructions,在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


    【解决方案1】:

    这是因为 Page 模型上的 url 属性是 defined by this line of code

    url = property(get_url)
    

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

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

    根据文档,如果您要设置自定义 URL 方案,建议使用 get_url_parts 覆盖,因为它包含所有 URL 访问器(urlget_url、@ 987654335@, relative_url)。

    【讨论】:

      猜你喜欢
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2011-06-11
      相关资源
      最近更新 更多