代码之家  ›  专栏  ›  技术社区  ›  Dan Swain

覆盖摇摆页。获取url()?

  •  0
  • Dan Swain  · 技术社区  · 5 年前

    试图只用摇尾 Page 对于nav结构,我声明了以下内容,以便在需要时呈现链接,而不是页面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定义的项目url Page.get_url() 函数始终被渲染,而 def get_url() 我已经定义了永远不会被处决。

    我知道Wagtail菜单,但我试图在这个项目中不具有另一种依赖性,所以除了上述是否是最好的架构之外,我还缺少什么来让它工作呢?


    为了跟进,我一直在跟进 these instructions ,并在 class Node(Page) 型号I现在有以下替代品: 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
    

    我发现我仍然需要使用URL呈现页面 item.specific.get_url . item.url 这行不通。

    0 回复  |  直到 5 年前
        1
  •  1
  •   gasman    5 年前

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

    url = property(get_url)
    

    i、 e.定义一个属性 网址 这就结束了对 get_url 作用 当那行代码运行时,它就已经存在了 -即页面的默认实现。获取url。即使你超控 获取url 在节点模型上,节点模型的 网址 属性仍将指向原始定义。

    如果你加一行 url = property(get_url) 在你定义了 获取url ,或致电 {{ item.specific.get_url }} 直接在模板上,您应该有望看到所需的行为。

    根据文件, get_url_parts 如果要设置自定义URL方案,建议使用此方法进行覆盖,因为它包含所有URL访问器共用的共享逻辑( 网址 , 获取url , full_url , relative_url ).